如何根据对象的属性合并两个不同长度的对象



我有两个不同大小的对象数组:

const generalValues= [{time: "08:10", general: 50}, {time: "08:15", general: 60}, {time: "08:20": general: 70},...]
const specValues= [{time: "08:00", spec: 30}, {time: "08:10", spec: 60}, {time: "08:15": spec: 20},...]

我想根据时间将它们组合成一个列表:

const result = [{time: "08:00", general: null, spec: 30}, 
{time: "08:10", general: 50, spec: 60}, 
{time: "08:15", general: 60, spec: 20}, 
{time: "08:20", general: 70, spec: null}...]

我尝试过减少和地图:

const resultMap = generalValues.reduce((item, {time, value}) => (item[time] = value, item), {})
const final = specValues.map(({time, ...rest}) => 
Object.assign({time}, rest, resultMap[time] ? {value: resultMap[time]} : {}))

但这不是我想要的。请帮我怎么做?

您可以在连接的数组上使用Array.reduce(),按date对项目进行分组,然后在给定日期值不存在generalspec属性的情况下更新它们。

这将创建一个映射对象,每个日期都有一个类似{date,general,spec}的条目。

我们可以使用Object.values()来获得作为数组的结果。

const generalValues = [{time: '08:10', general: 50}, {time: '08:15', general: 60}, {time: '08:20', general: 70}]
const specValues = [{time: '08:00', spec: 30}, {time: '08:10', spec: 60}, {time: '08:15', spec: 20}]
const resultUnsorted = Object.values([...generalValues, ...specValues].reduce((acc, { time, general = null, spec = null }) => { 
acc[time] = acc[time] || { time };
acc[time].general = acc[time].general || general;
acc[time].spec = acc[time].spec || spec;
return acc;
}, {}))
const resultSorted = resultUnsorted.sort(({ time: a},{ time: b}) => a.localeCompare(b));  
console.log('Result:', resultSorted);
.as-console-wrapper { max-height: 100% !important; }

最新更新