He estado tratando de lidiar con el json a continuación durante unos días.
[ {createdAt: "2021-09-09 07:37", user_id: "admin", type: "click", query: "spider"}, {createdAt: "2021-09-09 07:37", user_id: "admin", type: "search", query: "spider"}, {createdAt: "2021-09-09 07:38", user_id: "user", type: "click", query: "hi"}, ]Si cierto valor está duplicado, quiero agregarlo a una nueva matriz. como esto
[ { createdAt: "2021-09-09 07:37", user_id: "admin", query: "spider", type: "click", result: [ {createdAt: "2021-09-09 07:37", user_id: "admin", type: "search", query: "spider"} ] }, {createdAt: "2021-09-09 07:38", user_id: "user", type: "click", query: "hi"} ] La función groupBy de lodash es la más similar, pero no estoy familiarizado con JavaScript.
¿Alguien puede ayudarme a manejar esos json?
Puede lograr fácilmente el resultado usando Map y forEach
const arr = [ { createdAt: "2021-09-09 07:37", user_id: "admin", type: "click", query: "spider", }, { createdAt: "2021-09-09 07:37", user_id: "admin", type: "search", query: "spider", }, { createdAt: "2021-09-09 07:38", user_id: "user", type: "click", query: "hi", }, ]; let map = new Map(); arr.forEach((obj) => { const { user_id, createdAt } = obj; if (map.has(`${user_id}|${createdAt}`)) map.get(`${user_id}|${createdAt}`).push(obj); else map.set(`${user_id}|${createdAt}`, [obj]); }); const result = []; for (let [, v] of map) { const [first, ...rest] = v; const temp = Object.assign({}, first); if (rest.length) temp.result = rest; result.push(temp); } console.log(result); /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }A continuación se muestra otro enfoque.
usa un Array.reduce para construir un diccionario para almacenar cuántas veces ocurre la clave y dónde guardar los datos de la clave.
usa otro Array.reduce para hacer un bucle de todos los elementos y luego aplica tu lógica.
const data = [ {createdAt: "2021-09-09 07:37", user_id: "admin", type: "click", query: "spider"}, {createdAt: "2021-09-09 07:37", user_id: "admin", type: "search", query: "spider"}, {createdAt: "2021-09-09 07:38", user_id: "user", type: "click", query: "hi"}, ] function relayout() { const indexes = data.reduce((pre, cur) => { pre[`${cur.createdAt}-${cur.user_id}`] = [0, 0] // count, position in result array return pre }, {}) return data.reduce((pre, cur) => { const key = `${cur.createdAt}-${cur.user_id}` if (indexes[key][0] > 0) { pre[indexes[key][1]].result = [ ...(pre[indexes[key][1]].result || []), cur ] } else { pre.push(cur) indexes[key][1] = pre.length - 1 } indexes[key][0] += 1 return pre }, []) } console.log(relayout(data))