[英]Combine objects in array if dates are equal javascript
我在 Javascript 中有一个数组,如果它们具有相同的 reminder.date,我需要组合对象
const tasks = [
{
id: 1,
title: "call Tom",
reminders: {
date: "2022-02-01",
time: "09:30"
}
},
{
id: 2,
title: "Meet Bred",
reminders: {
date: "2022-02-01",
time: "10:30"
}
},
{
id: 3,
title: "Mail Susan",
reminders: {
date: "2022-03-01",
time: "19:00"
}
},
Output应该是这样的
const combinedTasks = [
{
id: 1,
tasks: ["call Tom", "Meet Bred"],
reminders: {
date: "2022-02-01",
time: "09:30"
}
},
{
id: 3,
tasks: ["Mail Susan"]
reminders: {
date: "2022-03-01",
time: "19:00"
}
}
我想我需要使用 Array.reduce 方法,但我不知道如何正确地使用它
这是使用reduce()
完成此操作的一种方法
let tasks = [{ id: 1, title: "call Tom", reminders: { date: "2022-02-01", time: "09:30" } }, { id: 2, title: "Meet Bred", reminders: { date: "2022-02-01", time: "10:30" } }, { id: 3, title: "Mail Susan", reminders: { date: "2022-03-01", time: "19:00" } }]; let combinedTasks = tasks.reduce((combined, x) => { // Try to find an existing item in the combined tasks array where the date equals this task item. let match = combined.find(y => y.reminders.date == x.reminders.date); if (match) { // If we find a match, add this task item's title to the combined item's tasks array. match.tasks.push(x.title); } else { // If we didn't find a match, take this task item and turn it into a combined tasks item with a tasks array so that future items in the tasks array can be combined with this one. let copy = {...x }; copy.tasks = [x.title]; delete copy.title; combined.push(copy); } return combined; }, []); console.log(combinedTasks);
const tasks = [
{
id: 1,
title: "call Tom",
reminders: {
date: "2022-02-01",
time: "09:30"
}
},
{
id: 2,
title: "Meet Bred",
reminders: {
date: "2022-02-01",
time: "10:30"
}
},
{
id: 3,
title: "Mail Susan",
reminders: {
date: "2022-03-01",
time: "19:00"
}
}
]
tasks.sort((a,b)=>{
return new Date(a.reminders.date) - new Date(b.reminders.date)
})
let output = [];
tasks.map((val,index)=>{
if(index===0){
let obj = {}
temp = [];
temp.push(val.title);
obj.id = val.id;
obj.tasks = [...temp];
obj.reminders = {...val.reminders};
output.push(obj);
}else{
if(output[output.length-1].reminders.date===val.reminders.date){
output[output.length-1].tasks.push(val.title);
}else{
let obj = {}
temp = [];
temp.push(val.title);
obj.id = val.id;
obj.tasks = [...temp];
obj.reminders = val.reminders;
output.push(obj);
}
}
})
试试这个解决方案,它有效。
Output :
[
{
id: 1,
tasks: [ 'call Tom', 'Meet Bred' ],
reminders: { date: '2022-02-01', time: '09:30' }
},
{
id: 3,
tasks: [ 'Mail Susan' ],
reminders: { date: '2022-03-01', time: '19:00' }
}
]
此代码的 Output 符合预期。 我希望这是有帮助的。
你是对的,你必须使用reduce
方法。
用它来遍历你的初始数组。 因此,对于每个任务,如果您在当前任务日期有任务,您可以在 futur 数组中观察。 否则您可以创建一个新任务并稍后添加下一个任务。
const tasks = [
{
id: 1,
title: "call Tom",
reminders: {
date: "2022-02-01",
time: "09:30"
}
},
{
id: 2,
title: "Meet Bred",
reminders: {
date: "2022-02-01",
time: "10:30"
}
},
{
id: 3,
title: "Mail Susan",
reminders: {
date: "2022-03-01",
time: "19:00"
}
}
];
const combinatedTasks = tasks.reduce((_combinatedTasks, currentTask) => {
const currentDate = currentTask.reminders.date;
const combinatedTaskAtCurrentDate = _combinatedTasks.find(task => task.reminders.date === currentDate);
if (combinatedTaskAtCurrentDate) {
combinatedTaskAtCurrentDate.tasks.push(currentTask.title);
} else {
_combinatedTasks.push({
id: currentTask.id,
tasks: [currentTask.title],
reminders: currentTask.reminders
});
}
return _combinatedTasks;
}, []);
console.log(combinatedTasks);
我希望这种方法对你有所帮助。
const tasks = [ { id: 1, title: "call Tom", reminders: { date: "2022-02-01", time: "09:30" } }, { id: 2, title: "Meet Bred", reminders: { date: "2022-02-01", time: "10:30" } }, { id: 3, title: "Mail Susan", reminders: { date: "2022-03-01", time: "19:00" } }]; let cmbArray =[]; tasks.forEach(x=>{ if ( item = cmbArray.find(a=>a.reminders.date === x.reminders.date)) { item.tasks.push(x.title); } else { x.tasks = [x.title]; delete x.title; cmbArray.push(x); } }); console.log(cmbArray);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.