合并相同日期的对象数组并整合动态属性至目标数据结构
合并相同日期的对象数组并整合动态属性至目标数据结构
嘿,你已经离目标只差一步啦!问题就出在你之前把动态属性塞进了results数组里,而不是直接挂载到日期对应的对象上。咱们调整下reduce的逻辑就能搞定:
方案一:基于原思路优化(数组累加器)
这个方案和你原来的写法更接近,只是把属性合并逻辑改了:
const measures = [ { "13798494-value": 0.207, readingDate: "26/06/2023" }, { "4958469-value": 0.211 , readingDate: "26/06/2023" }, { "13798494-value": 0.214 , readingDate: "27/06/2023" }, { "4958469-value": 0.123, readingDate: "27/06/2023" } ]; const mergedMeasures = measures.reduce((acc, item) => { // 解构分离日期和所有动态属性(自动适配任意XX-value格式) const { readingDate, ...dynamicProps } = item; // 查找当前日期对应的已存在条目 const existingEntry = acc.find(entry => entry.readingDate === readingDate); if (existingEntry) { // 若存在,直接把动态属性合并到已有对象中 Object.assign(existingEntry, dynamicProps); } else { // 若不存在,创建新条目加入累加器 acc.push({ readingDate, ...dynamicProps }); } return acc; }, []); console.log(mergedMeasures);
方案二:用对象映射优化性能(大数据量更友好)
如果你的数组数据量比较大,用对象做中间映射会比每次find更高效(查找时间从O(n)降到O(1)):
const measures = [ { "13798494-value": 0.207, readingDate: "26/06/2023" }, { "4958469-value": 0.211 , readingDate: "26/06/2023" }, { "13798494-value": 0.214 , readingDate: "27/06/2023" }, { "4958469-value": 0.123, readingDate: "27/06/2023" } ]; const mergedMeasures = Object.values( measures.reduce((dateMap, item) => { const { readingDate, ...dynamicProps } = item; // 若当前日期还没在映射里,先初始化一个带日期的对象 if (!dateMap[readingDate]) { dateMap[readingDate] = { readingDate }; } // 合并动态属性到对应日期的对象中 Object.assign(dateMap[readingDate], dynamicProps); return dateMap; }, {}) ); console.log(mergedMeasures);
关键改进点说明
- 用
{ readingDate, ...dynamicProps }解构:自动提取日期,同时把所有动态的XX-value属性打包成一个对象,完全不用硬编码属性名,完美适配你说的动态格式。 - 直接合并属性到主对象:不再把属性塞进
results数组,而是直接挂载到日期对应的对象上,这样就得到了你想要的扁平结构。
两种方案最终都会输出你期望的结果:
const measures = [ { readingDate: "26/06/2023", "13798494-value": 0.207, "4958469-value": 0.211 }, { readingDate: "27/06/2023", "13798494-value": 0.214, "4958469-value": 0.123 } ]
备注:内容来源于stack exchange,提问作者32423hjh32423
相关产品推荐
相关产品推荐

