Tengo dos matrices:
const array = [ [1, 7, 'AAA'], [2, 5, 'BBB'], [3, 2, 'CCC'], [4, 4, 'DDD'], [4, 9, 'EEE'], [4, 2, 'FFF'], [5, 8, 'GGG'], [6, 2, 'HHH']]; const names = [ [1, 'Joe'], [2, 'Dave'], [3, 'Mike'], [4, 'Sandra'], [5, 'Sue'], [6, 'Mary']];Según el valor de la primera columna, quiero sumar los valores de la matriz[1] y enumerar las letras de tres caracteres. El resultado que estoy tratando de obtener es:
const names = [ [1, 'Joe',7,'AAA'], [2, 'Dave',5,'BBB'], [3, 'Mike',2,'CCC'], [4, 'Sandra',15,'DDD, EEE, FFF'], [5, 'Sue',8,'GGG'], [6, 'Mary',2,'HHH']]No estoy seguro del mejor enfoque, soy bastante nuevo en Javascript. Lo que logré hacer es obtener el resultado correcto cuando un valor en la matriz [0] no se repite, pero no puedo hacer que funcione una suma o una lista.
const counter = (array,value) => array.filter((v) => (v === value)).length; const arrayCol = (array,value) => array.map(v => v[value]); const sum = (prevVal, curVal) => prevVal + curVal; names.forEach ((p,e) => { array.forEach ((v,x) => (counter(arrayCol(array,0),v[0])===1) ? (v[0]===p[0]) && names[e].push(v[1],v[2]) : (v[0]===p[0]) && names[e].push(array.reduce(sum,0)) ); }); console.log(names); Estoy seguro de que la respuesta tiene que ver con el map o el filter , pero no estoy seguro de cómo ... se agradece cualquier sugerencia. Gracias
EDITAR: Las tres respuestas a continuación (de Michael Haddad , Nina Scholz y testing_22 ) funcionan y son interesantes.
Puede recopilar todos los datos para cada grupo y luego mapear el resultado en el orden de la matriz de nombres.
const array = [[1, 7, 'AAA'], [2, 5, 'BBB'], [3, 2, 'CCC'], [4, 4, 'DDD'], [4, 9, 'EEE'], [4, 2, 'FFF'], [5, 8, 'GGG'], [6, 2, 'HHH']], names = [[1, 'Joe'], [2, 'Dave'], [3, 'Mike'], [4, 'Sandra'], [5, 'Sue'], [6, 'Mary']], groups = array.reduce((r, [id, value, code]) => { r[id] ??= [0, '']; r[id][0] += value; r[id][1] += (r[id][1] && ', ') + code; return r; }, {}), result = names.map(a => [...a, ...groups[a[0]]]); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Puede usar una combinación de mapa y reducción, como en:
const array = [[1, 7, 'AAA'], [2, 5, 'BBB'], [3, 2, 'CCC'],[4, 4, 'DDD'], [4, 9, 'EEE'], [4, 2, 'FFF'], [5, 8, 'GGG'], [6, 2, 'HHH']]; const names = [[1, 'Joe'],[2, 'Dave'],[3, 'Mike'],[4, 'Sandra'],[5, 'Sue'],[6, 'Mary']]; const result = names.map(([id, name]) => { let vals = []; let sum = array.reduce((acc, [idx, number, XXX]) => (idx === id ? (vals.push(XXX), number) : 0) + acc, 0); return [ id, name, sum, vals.join(", ") ] }) console.log(result)Un enfoque básico podría ser:
const array = [[1, 7, 'AAA'], [2, 5, 'BBB'], [3, 2, 'CCC'], [4, 4, 'DDD'], [4, 9, 'EEE'], [4, 2, 'FFF'], [5, 8, 'GGG'], [6, 2, 'HHH']]; const names = [[1, 'Joe'], [2, 'Dave'], [3, 'Mike'], [4, 'Sandra'], [5, 'Sue'], [6, 'Mary']]; let result = []; for (let name of names) { let newValue = [...name, 0]; let matchingItems = array.filter(i => i[0] === name[0]); let strings = []; // for lack of a better name... for (let item of matchingItems) { newValue[2] += item[1]; strings.push(item[2]); } newValue.push(strings.join(", ")); result.push(newValue); } console.log(result);También podría implementar la lógica de unión usted mismo (de hecho, prefiero esta versión por razones de legibilidad):
const array = [[1, 7, 'AAA'], [2, 5, 'BBB'], [3, 2, 'CCC'], [4, 4, 'DDD'], [4, 9, 'EEE'], [4, 2, 'FFF'], [5, 8, 'GGG'], [6, 2, 'HHH']]; const names = [[1, 'Joe'], [2, 'Dave'], [3, 'Mike'], [4, 'Sandra'], [5, 'Sue'], [6, 'Mary']]; let result = []; for (let name of names) { let newValue = [...name, 0, ""]; let matchingItems = array.filter(i => i[0] === name[0]); for (let item of matchingItems) { newValue[2] += item[1]; newValue[3] += newValue[3] === "" ? item[2] : `, ${item[2]}`; } result.push(newValue); } console.log(result);