Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript数组合并具有相同键值的对象_Javascript_Arrays - Fatal编程技术网

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;
},[])

控制台日志(分组)实现您想要的并不困难。所以我想知道你尝试了什么,怎么会失败?