Javascript数组合并具有相同键值的对象
假设我有一个数组,其中包含如下内容Javascript数组合并具有相同键值的对象,javascript,arrays,Javascript,Arrays,假设我有一个数组,其中包含如下内容 arr = [ {date:'2020-10-21', time_start:'8:00', time_end:'9:00'}, {date:'2020-10-22', time_start:'12:00', time_end:'1:00'}, {date:'2020-10-21', time_start:'10:00', time_end:'11:00'} ] new_arr = [ {
arr = [ {date:'2020-10-21', time_start:'8:00', time_end:'9:00'},
{date:'2020-10-22', time_start:'12:00', time_end:'1:00'},
{date:'2020-10-21', time_start:'10:00', time_end:'11:00'} ]
new_arr = [ {
date:'2020-10-21',
time_start:[ '8:00', '10:00' ],
time_end:[ '9:00', '11:00' ]
},
{
date:'2020-10-22', time_start: '12:00', time_end: '1:00'
}
]
我如何使我合并它,使它看起来像这样
arr = [ {date:'2020-10-21', time_start:'8:00', time_end:'9:00'},
{date:'2020-10-22', time_start:'12:00', time_end:'1:00'},
{date:'2020-10-21', time_start:'10:00', time_end:'11:00'} ]
new_arr = [ {
date:'2020-10-21',
time_start:[ '8:00', '10:00' ],
time_end:[ '9:00', '11:00' ]
},
{
date:'2020-10-22', time_start: '12:00', time_end: '1:00'
}
]
您可以使用array reduce和use Object.values。使用
reduce
从累加器对象开始,检查对象是否具有按日期的键。如果没有,则在对象中创建该键
const arr=[{
日期:“2020-10-21”,
开始时间:“8:00”,
时间结束:“9:00”
},
{
日期:“2020-10-22”,
开始时间:“12:00”,
时间结束:“1:00”
},
{
日期:“2020-10-21”,
开始时间:“10:00”,
时间结束:“11:00”
}
];
常数dt=arr.reduce((acc,curr)=>{
如果(!会计[当前日期]){
会计科目[当前日期]={
日期:当前日期,
时间开始:当前时间开始,
时间结束:当前时间结束
};
}否则{
if(Array.isArray(acc[curr.date].time_start)){
acc[当前日期]。时间\开始推送(当前日期);
}否则{
acc[curr.date]。时间开始=[acc[curr.date]。时间开始,curr.date];
}
if(Array.isArray(acc[curr.date].time_end)){
acc[当前日期]。时间\结束推送(当前日期);
}否则{
acc[curr.date]。时间结束=[acc[curr.date]。时间结束,curr.date];
}
}
返回acc;
}, {}); // 累加器对象
console.log(Object.values(dt))
new_arr=[{date:'2020-10-21',time_start:['8:00','10:00',time_end:['9:00','11:00']},{date:'2020-10-22',time_start:'12:00',time_end:'1:00']
您可以简单地使用它来按键减少重复项。。。看起来你想要那个
// to keep the first obj duplicate
function uniqByKeepFirst(a, key) {
let seen = new Set();
return a.filter(item => {
let k = key(item);
return seen.has(k) ? false : seen.add(k);
});
}
// to keep the last obj duplicate
function uniqByKeepLast(a, key) { // edit: adding method to keep last
return [
...new Map(
a.map(x => [key(x), x])
).values()
]
}
let arr = [{
date: '2020-10-21',
time_start: '8:00',
time_end: '9:00'
},
{
date: '2020-10-22',
time_start: '12:00',
time_end: '1:00'
},
{
date: '2020-10-21',
time_start: '10:00',
time_end: '11:00'
}
]
console.log(uniqByKeepFirst(arr, obj => obj.date));
console.log(uniqByKeepLast(arr, obj => obj.date));
如果您需要分组,最简单的方法是使用
。reduce
let arr=[{date:'2020-10-21',time_start:'8:00',time_end:'9:00'},
{日期:'2020-10-22',开始时间:'12:00',结束时间:'1:00'},
{日期:'2020-10-21',开始时间:'10:00',结束时间:'11:00']
让分组=arr.reduce((a,{date,time\u start,time\u end})=>{
让item=a.find(el=>el.date==date);
如果(!item)返回[…a,{日期,时间开始:[时间开始],时间结束:[时间结束]}];
item.time\u start.push(时间开始)
项目。时间结束。推送(时间结束);
返回a;
},[])
控制台日志(分组)代码>实现您想要的并不困难。所以我想知道你尝试了什么,怎么会失败?