我有两个不同大小的对象数组:
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
对项目进行分组,然后在给定日期值不存在general
或spec
属性的情况下更新它们。
这将创建一个映射对象,每个日期都有一个类似{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; }