Tengo una matriz de objetos con una sub-matriz. Quiero empujar el valor de la suma de la sub-matriz en la matriz de objetos principal.
La suma de la submatriz está determinada por la matriz de búsqueda.
Aquí está la matriz principal con la sub-matriz:
const objectArray = [ { 'name': 'Alpha', 'data': [{ 'subData': 'a', 'value': 1 }, { 'subData': 'a', 'value': 2 }, { 'subData': 'b', 'value': 3 }, { 'subData': 'b', 'value': 4 }, { 'subData': 'c', 'value': 5 }] }, { 'name': 'Beta', 'data': [{ 'subData': 'a', 'value': 8 }, { 'subData': 'a', 'value': 9 }, { 'subData': 'b', 'value': 10 }, { 'subData': 'b', 'value': 11 }] } ]Aquí está la matriz de búsqueda:
const searchArray = [ { 'search': 'a' }, { 'search': 'b' },{ 'search': 'c' }]Esto es lo que he comenzado:
for (let i = 0; i < objectArray.length; i++) { for (let j = 0; j < searchArray.length; j++) { const filterObject = objectArray[i].data.filter(a => a.subData == searchArray[j].search); const sumValue = filterObject && filterObject.length > 0 ? filterObject.reduce(function (a, b) { return a + +b.value; }, 0) : 0; const keyName = searchArray[j].search; var objPush = {}; objPush[keyName] = sumValue; // console.log(' obj:', obj ); } }Aquí, el objeto "objPush" debe agregarse a objectArray para que la matriz deseada sea esta:
const desiredArray = [ { 'name': 'Alpha', 'a': 3, 'b': 7, 'c':5, 'data': [{ 'subData': 'a', 'value': 1 }, { 'subData': 'a', 'value': 2 }, { 'subData': 'b', 'value': 3 }, { 'subData': 'b', 'value': 4 }, { 'subData': 'c', 'value': 5 }] }, { 'name': 'Beta', 'a': 17, 'b': 21, 'c':0, 'data': [{ 'subData': 'a', 'value': 8 }, { 'subData': 'a', 'value': 9 }, { 'subData': 'b', 'value': 10 }, { 'subData': 'b', 'value': 11 }] } ]¿Cómo logro mi Array deseado?
Puede lograr fácilmente el resultado usando map , forEach y reduce
const objectArray = [ { name: "Alpha", data: [ { subData: "a", value: 1 }, { subData: "a", value: 2 }, { subData: "b", value: 3 }, { subData: "b", value: 4 }, { subData: "c", value: 5 }, ], }, { name: "Beta", data: [ { subData: "a", value: 8 }, { subData: "a", value: 9 }, { subData: "b", value: 10 }, { subData: "b", value: 11 }, ], }, ]; const searchArray = [{ search: "a" }, { search: "b" }, { search: "c" }]; const result = objectArray.map((obj) => { const temp = { ...obj }; searchArray.forEach(({ search }) => { temp[search] = obj.data.reduce((acc, curr) => (curr.subData === search ? acc + curr.value : acc),0); }); return 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; } const objectArray = [ { name: 'Alpha', data: [ { subData: 'a', value: 1 }, { subData: 'a', value: 2 }, { subData: 'b', value: 3 }, { subData: 'b', value: 4 }, { subData: 'c', value: 5 }, ], }, { name: 'Beta', data: [ { subData: 'a', value: 8 }, { subData: 'a', value: 9 }, { subData: 'b', value: 10 }, { subData: 'b', value: 11 }, ], }, ]; function reduceData(array) { return array.reduce((acc, el) => { if (acc[el.subData]) { acc[el.subData] += el.value; } else { acc[el.subData] = el.value || 0; } return acc; }, {}); } function handleArray(array) { return array.map((el) => ({ ...el, ...reduceData(el.data) })) } console.log(handleArray(objectArray));No está claro cómo espera usar su searchArray en un sentido más general, ya que les está dando a todos la misma clave de search y no la está usando para especificar propiedades más específicamente.
Si solo desea agregar todos los subData en todos los objetos, primero puede extraer todos los valores de subData únicos.
const sub_datum = [...new Set(objectArray.flatMap((o) => o.data.map((d) => d.subData)))]; Y luego map() sobre la matriz y agregar la matriz de data de cada objeto.
const objectArray = [ { name: 'Alpha', data: [ { subData: 'a', value: 1 }, { subData: 'a', value: 2 }, { subData: 'b', value: 3 }, { subData: 'b', value: 4 }, { subData: 'c', value: 5 }, ], }, { name: 'Beta', data: [ { subData: 'a', value: 8 }, { subData: 'a', value: 9 }, { subData: 'b', value: 10 }, { subData: 'b', value: 11 }, ], }, ]; const aggregate_subdata = (arr, data_points) => arr.reduce( (a, o) => ((a[o.subData] = a[o.subData] + o.value), a), Object.fromEntries(data_points.map((k) => [k, 0])) ); const sub_datum = [...new Set(objectArray.flatMap((o) => o.data.map((d) => d.subData)))]; const result = objectArray.map((o) => ({ ...o, ...aggregate_subdata(o.data, sub_datum) })); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }