0

我在Javascript中有一个数组,如果它们具有相同的remind.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"
 }
},

输出应该是这样的

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 方法,但我不知道如何正确地做到这一点

4

4 回答 4

2

这是您可以使用的一种方法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);

于 2022-02-22T14:14:10.023 回答
1
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' }
  }
]

此代码的输出符合预期。我希望这是有帮助的 。

于 2022-02-22T14:10:42.607 回答
1

你是对的,你必须使用reduce方法。

用它来循环你的初始数组。因此,对于每个任务,如果您在当前任务日期有任务,您可以在您的未来数组中查看。否则,您可以创建一个新任务并稍后添加下一个任务。

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);

于 2022-02-22T14:17:54.870 回答
0

我希望这种方法对您有所帮助。

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);

于 2022-02-22T14:10:29.450 回答