Merge array objects of different values in a new object

71 Views Asked by At

I have 3 array objects-

dates = [{date: '12/04/2023'}, {date: '13/04/2023'}]
days = [{day: 'Monday'}, {day: 'Tuesday'}]
time = [{time: '09-10'}, {time: '10-11'}]

the final array should be like:

final = [
{
 date: '12/04/2023',
 day: 'Monday',
 time: '09-10'
},
{
 date: '13/04/2023',
 day: 'Tuesday',
 time: '10-11'
 }
]

I tried merging/concat the arrays and other solutions that I could find but couldn't find anything closer to my desired result.

I know there have been multiple questions on merging array objects but I haven't been able to find any solution that fits my requirement.

Any help would highly appreciated.Thanks.

5

There are 5 best solutions below

3
cmgchess On BEST ANSWER

you can use map and the index to access other arrays.

const dates = [{date: '12/04/2023'}, {date: '13/04/2023'}]
const days = [{day: 'Monday'}, {day: 'Tuesday'}]
const time = [{time: '09-10'}, {time: '10-11'}]

const res = dates.map(({date},i) => ({date, day: days[i].day, time: time[i].time}))

console.log(res)

3
Hetal N On

Try this changes,

dates = [{date: '12/04/2023'}, {date: '13/04/2023'}]
days = [{day: 'Monday'}, {day: 'Tuesday'}]
time = [{time: '09-10'}, {time: '10-11'}]
    
const result = dates.map((d,index) => {
    d.day = days[index].day;
    d.time = time[index].time;
})

console.log(result)
0
Chan On

You can use for loop for simple reading and better performance

dates = [{date: '12/04/2023'}, {date: '13/04/2023'}]
days = [{day: 'Monday'}, {day: 'Tuesday'}]
time = [{time: '09-10'}, {time: '10-11'}]

combined = []

for(i = 0; i < dates.length; i++){
  combined.push({
  date: dates[i].date, 
  day: days[i].day, 
  time: time[i].time
  })
}

console.log(combined)

Also... there is this post that might help you with repeated date and you wanted to make it unique. Create New array from another array

0
Muriithi Derrick On

Using a for loop.

const final = [];

for (let date = 0; date < dates.length; date++) {
  for (let day = 0; day < days.length; day++) {
    for (let t = 0; t < time.length; t++) {
      const tmp = {
        date: dates[date].date,
        day: days[day].day,
        time: time[t].time
      };
      result.push(tmp);
    }
  }
}

console.log(final);
0
zb22 On

I think @cmgchess has the best answer,
Just wanted to share an interesting solution for this by using Array.prototype.reduce() and the remainder of the array's index and the length of the array:

const dates = [{date: '12/04/2023'}, {date: '13/04/2023'}];
const days = [{day: 'Monday'}, {day: 'Tuesday'}];
const time = [{time: '09-10'}, {time: '10-11'}];

const size = dates.length;
const res = [...dates, ...days, ...time].flat().reduce((acc, curr, index) => {
  acc[index % size] = {
    ...acc[index % size],
    ...curr
  }

  return acc;
}, []);

console.log(res);