Tengo una matriz que se ve así:
var arr = [ [ "2021-07-31T00:00:00Z", "648429a0-00e5-4752-9d84-2857a0ea0787" ], [ "2021-08-31T00:00:00Z", "648429a0-00e5-4752-9d84-2857a0ea0787" ], [ "2021-07-31T00:00:00Z", "AAAA" ], [ "2021-08-31T00:00:00Z", "BBBB" ]]
Me gustaría transformar esto en función del primer valor (la fecha) de cada matriz. Entonces, si las fechas coinciden, se fusionarán en una sola. Entonces, la salida que estoy tratando de obtener es
[ [ "2021-07-31T00:00:00Z", "648429a0-00e5-4752-9d84-2857a0ea0787", "AAAA" ], [ "2021-08-31T00:00:00Z", "648429a0-00e5-4752-9d84-2857a0ea0787", "BBBB" ]]
Se agradecería saber cuál sería el mejor enfoque en este caso.
Use un mapa para sobrescribir los valores tal como se encuentran en la matriz. Luego use Object.entries() para crear la matriz final:
var original = [ [1,2], [1,3], [2,3]] var final = [] var map = {} original.forEach(a => { if (!map[a[0]]) { map[a[0]] = [] } map[a[0]].push(a[1]); }); Object.entries(map).forEach(e => final.push([e[0], ...e[1]]))Editar: Cambió la respuesta para obtener todos los valores.
La tarea del OP se puede lograr sin iteraciones anidadas dentro de un solo ciclo de reduce .
El enfoque subyacente es utilizar un objeto personalizado como acumulador/colector. Dicho recopilador presenta 2 propiedades... index que sirve como mapa/búsqueda basado en Object para matrices agrupadas donde la clave de grupo es siempre el primer elemento de cada matriz (a ser) procesada... y... result que va a mantenga las referencias de las matrices agrupadas mencionadas anteriormente (aún por crear) donde uno siempre inserta el segundo elemento de la matriz actualmente procesada.
var arr = [[ "2021-07-31T00:00:00Z", "648429a0-00e5-4752-9d84-2857a0ea0787", ], [ "2021-08-31T00:00:00Z", "648429a0-00e5-4752-9d84-2857a0ea0787", ], [ "2021-07-31T00:00:00Z", "AAAA", ], [ "2021-08-31T00:00:00Z", "BBBB", ]]; function collectAndAggregateGroupedArrays(collector, item) { const { index, result } = collector; let groupKey = item[0]; let groupedList = index[groupKey]; if (!groupedList) { groupedList = index[groupKey] = [groupKey]; result.push(groupedList); } groupedList.push(item[1]); return collector; } console.log( arr.reduce(collectAndAggregateGroupedArrays, { index: {}, result: [], }).result ); .as-console-wrapper { min-height: 100%!important; top: 0; }Puedes probar este enfoque de reducción
var arr = [ [ "2021-07-31T00:00:00Z", "648429a0-00e5-4752-9d84-2857a0ea0787" ], [ "2021-08-31T00:00:00Z", "648429a0-00e5-4752-9d84-2857a0ea0787" ], [ "2021-07-31T00:00:00Z", "AAAA" ], [ "2021-08-31T00:00:00Z", "BBBB" ] ]; arr = arr.reduce((a, i) => { if (!a) a = []; var found = false; a.forEach(ai => { if (ai[0] == i[0]) { found = true; for (var k = 0; k < i.length; k++) { if (k > 0) ai.push(i[k]); } } }); if (!found) a.push(i); return a; }, []);