如何在循环中计算子数组总和并将动态属性添加到对象数组中
解决方案
方案1:修改原数组(基于你现有代码调整)
你现有的逻辑已经完成了按维度求和的计算,只需要将计算得到的键值对直接挂载到当前遍历的主数组元素上即可,调整后的代码如下:
for (let i = 0; i < objectArray.length; i++) { // 取当前遍历的主数组元素 const currentItem = objectArray[i]; for (let j = 0; j < searchArray.length; j++) { const targetSub = searchArray[j].search; const filterObject = currentItem.data.filter(a => a.subData == targetSub); const sumValue = filterObject.length > 0 ? filterObject.reduce(function (a, b) { return a + +b.value; }, 0) : 0; // 直接给当前元素添加对应属性即可 currentItem[targetSub] = sumValue; } } // 此时objectArray已经是你要的desiredArray格式 console.log(objectArray);
你之前定义的objPush没有实际使用,直接给主数组元素加属性就可以完成需求。
方案2:返回全新数组(不修改原数据,性能更优)
如果不想改动原objectArray,可以先统计每个元素的data里所有subData的总和,再对应搜索数组赋值,避免多次遍历data数组:
const desiredArray = objectArray.map(item => { // 先统计当前item下所有subData的总和 const sumMap = item.data.reduce((acc, cur) => { acc[cur.subData] = (acc[cur.subData] || 0) + cur.value; return acc; }, {}); // 按搜索数组的维度生成对应属性 const extraProps = searchArray.reduce((acc, cur) => { acc[cur.search] = sumMap[cur.search] || 0; return acc; }, {}); // 合并属性返回新对象 return { ...item, ...extraProps }; }); console.log(desiredArray);
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

