Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

123
Views
Combine objects in array if dates are equal javascript

I have an array in Javascript and I need to combine objects if they have equal 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 should be like this

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"
 }
}

I suppose that I need to use Array.reduce method but I dont have idea hot to do it correctly

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Here is one way you can accomplish this using 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);

about 4 years ago · Juan Pablo Isaza Report

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

Try this solution , it works .

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 of this code is as expected . I hope this is helpful .

about 4 years ago · Juan Pablo Isaza Report

0

you are right, you have to use the reduce method.

Use it to loop over your initial array. So for each task, you can watch in your futur array if you have a task at the current task date. Else you can create a new task and add next tasks later.

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

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!