按year键合并对象数组,解决worksSummaryDetailsObj数据错误问题
按年份合并对象数组的解决方案
原始数组
var worksSummaryDetailsArr = [ { year: 2020, worksSummaryDetailsObj: [ [Object], [Object], [Object], [Object] ] }, { year: 2021, worksSummaryDetailsObj: [ [Object], [Object], [Object], [Object] ] }, { year: 2022, worksSummaryDetailsObj: [ [Object], [Object], [Object], [Object] ] }, { year: 2021, worksSummaryDetailsObj: [ [Object], [Object], [Object], [Object] ] }, { year: 2022, worksSummaryDetailsObj: [ [Object], [Object], [Object], [Object] ] } ]
期望合并结果
[ { year: 2020, worksSummaryDetailsObj: [ [Object], [Object], [Object], [Object] ] }, { year: 2021, worksSummaryDetailsObj: [ [Object], [Object], [Object], [Object],[Object], [Object], [Object], [Object] ] }, { year: 2022, worksSummaryDetailsObj: [ [Object], [Object], [Object], [Object],[Object], [Object], [Object], [Object] ] } ]
你的代码问题分析
当前代码的核心错误是:worksSummaryDetailsObj 直接将过滤后的整个对象数组放入Set,而没有合并每个对象内部的worksSummaryDetailsObj数组。另外,Set用于对象去重在这里完全多余,反而会导致结构错误。
正确解决方案
方法1:使用reduce(简洁易懂)
const mergedArr = worksSummaryDetailsArr.reduce((acc, current) => { const existingItem = acc.find(item => item.year === current.year); if (existingItem) { // 合并数组 existingItem.worksSummaryDetailsObj = [...existingItem.worksSummaryDetailsObj, ...current.worksSummaryDetailsObj]; } else { // 添加新条目 acc.push({ year: current.year, worksSummaryDetailsObj: [...current.worksSummaryDetailsObj] }); } return acc; }, []); console.log(mergedArr);
方法2:使用对象映射(性能更优)
当处理大数据量数组时,find方法会带来O(n²)的时间复杂度,用对象做中间映射可以将时间复杂度降到O(n):
const yearMap = {}; worksSummaryDetailsArr.forEach(item => { if (!yearMap[item.year]) { yearMap[item.year] = { year: item.year, worksSummaryDetailsObj: [...item.worksSummaryDetailsObj] }; } else { yearMap[item.year].worksSummaryDetailsObj.push(...item.worksSummaryDetailsObj); } }); const mergedArr = Object.values(yearMap); console.log(mergedArr);
内容的提问来源于stack exchange,提问作者Mohamed Khalifa
相关产品推荐
相关产品推荐

