问题描述
我有一些对象数组 我想合并具有相同键的对象数组,并根据键和值将其创建为新对象
const data =[{
date:"19",status:"in",hour:”12:00”
},{
date:"19",hour:”12:20”
},{
date:"19",hour:”12:43”
},status:"out",hour:”16:16”
},{
date:"20",hour:07:30”
},hour:”14:40”
},{
date:"21",hour:”08:12”
}
]
这是我想要的结果
result =[{
date:”19”,hourIn= “12:00”,hourOut= “16:16”,},hourIn:"07:30",hourOut:14:40”
},hourIn:”08:12”,hourOut:”-“}]
我想如何解决这个问题?
解决方法
我是这样做的,
我遍历 data
,检查该日期是否已经过去。
如果不是,我检查 status
是 in
还是 out
,然后设置 hour
和 date
。
如果通过了,我检查了 status
,然后检查小时是早于 hourIn
还是晚于已设置的 hourOut
。
let result={};
const data=[{date:"19",status:"in",hour:"12: 00"},{date:"19",hour:"12:20"},hour:"12:43"},status:"out",hour:"16:16"},{date:"20",hour:"07:30"},hour:"14:40"},{date:"21",hour:"08:12"}];
data.forEach(({ date,status,hour }) => {
if (date in result) {
if (status == 'in' && hour < result[date].hourIn) result[date].hourIn = hour;
else if (status == 'out' && hour > result[date].hourOut) result[date].hourOut = hour;
} else result[date] = {
date,hourIn: status == 'in' ? hour : '-',hourOut: status == 'out' ? hour : '-'
};
});
result = Object.values(result);
console.log(result);
您正在尝试实现一个迷你 MapReduce。你可以谷歌了解更多详情。
-
创建一个 Map,其中键是您的日期,值是具有相同日期的对象数组。
-
现在通过将所有对象插入到地图中来按日期隔离所有对象。
-
根据输入、输出作为第一条件和时间作为第二条件对数组进行排序。因此,在每个数组中,第一个对象将在时间最先,最后一个对象将在时间最后。
-
使用第一个和最后一个对象将每个数组减少到一个对象中。
let map = new Map();
for(让 d 的数据){ 让 t = map.get(d.date)||[]; t.push(d); map.set(d.date,t); }
for(let v of map.values()){ v.sort((a,b)=>a.status
让结果 = []
for(let v of map.values()){ let reduce = // 从 v[0] v[v.length-1] 获取 结果。推(减少); }
既然我已经这样做了,我不确定它会增加多少,但这里有一种使用 reduce 的方法:
0