假设我有一个包含如下内容的数组...
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'
}
]
答案 0 :(得分:1)
如果您需要对事物进行分组,最简单的方法是使用.reduce
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'} ]
let grouped = arr.reduce((a, { date, time_start, time_end }) => {
let item = a.find(el => el.date === date);
if(!item) return [...a, {date, time_start: [time_start], time_end: [time_end] }];
item.time_start.push(time_start)
item.time_end.push(time_end);
return a;
},[])
console.log(grouped);
答案 1 :(得分:0)
您可以使用数组reduce和Object.values。使用reduce
以累加器对象开头,并按日期检查对象是否具有密钥。如果没有,则在对象中创建该键。
const 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"
}
];
const dt = arr.reduce((acc, curr) => {
if (!acc[curr.date]) {
acc[curr.date] = {
date: curr.date,
time_start: curr.time_start,
time_end: curr.time_end
};
} else {
if (Array.isArray(acc[curr.date].time_start)) {
acc[curr.date].time_start.push(curr.date);
} else {
acc[curr.date].time_start = [acc[curr.date].time_start, curr.date];
}
if (Array.isArray(acc[curr.date].time_end)) {
acc[curr.date].time_end.push(curr.date);
} else {
acc[curr.date].time_end = [acc[curr.date].time_end, curr.date];
}
}
return acc;
}, {}); // accumulator object
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' } ]
答案 2 :(得分:-1)
您可以简单地使用它来减少密钥重复...看起来像您想要的...
// 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));