繁体   English   中英

如果日期相等,则合并数组中的对象 javascript

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM