Сортировать массив и добавлять новые свойства

#javascript #arrays

#javascript #массивы

Вопрос:

Я пытаюсь сделать так, чтобы это array2 выглядело как array1 последовательность. Если какое-либо свойство отсутствует, я хотел бы добавить это свойство в array2 и присвоить значение 0 .

 Array1 = ["BREAKFAST", "AM", "LUNCH", "PM", "DINNER"]
Array2 = [
  {
    daypart: "DINNER",
    time: 10,
  },
  {
    daypart: "PM",
    time: 15,
  },
  {
    daypart: "LUNCH",
    time: 9,
  },
]

expectedArray = [
  { daypart: "BREAKFAST", time: 0 },
  { daypart: "AM", time: 0 },
  { daypart: "LUNCH", time: 9 },
  { daypart: "PM", time: 15 },
  { daypart: "DINNER", time: 10 },
]
  

ДЕМОНСТРАЦИЯ

Ответ №1:

Вы можете использовать Array#map наряду с Array#find .

 const Array1 = ['BREAKFAST', 'AM', 'LUNCH', 'PM', 'DINNER'],
Array2 = [{
          daypart: 'DINNER',
          time: 10
          },
          {
          daypart: 'PM',
          time: 15
          }, {
          daypart: 'LUNCH',
          time: 9
          }];
const res = Array1.map(x => Array2.find(({daypart})=>daypart===x) 
   ?? {daypart: x, time: 0});
console.log(res);  

Комментарии:

1. для меня этот ответ плохой, результат содержит ссылки на Array2, а не копии

2. @MisterJojo В вопросе когда-либо указывалось, что требуется копия?

3. @MisterJojo Нет необходимости рассматривать это, если у кого-то нет оснований полагать, что это необходимо. Конечно, в этом нет ничего плохого (в большинстве случаев), но это может быть излишним.

Ответ №2:

Я предлагаю…

 const
  Array1 = ['BREAKFAST', 'AM', 'LUNCH', 'PM', 'DINNER'],
  Array2 = 
      [ { daypart: 'DINNER', time: 10 } 
      , { daypart: 'PM',     time: 15 } 
      , { daypart: 'LUNCH',  time:  9 } 
      ],
  expectedArray = Array1.map(daypart=>
      {
      let a2el = Array2.find(x=>x.daypart===daypart)
      if (!a2el) return {daypart, time: 0}
      else return {...a2el} // to make a copy
      })


expectedArray.forEach(Ae=>console.log( JSON.stringify(Ae)))  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

Ответ №3:

Попробуйте этот:

 const Array1 = ['BREAKFAST', 'AM', 'LUNCH', 'PM', 'DINNER'];
const Array2 = [
    {
        daypart: 'DINNER',
        time: 10
    },
    {
        daypart: 'PM',
        time: 15
    },
    {
        daypart: 'LUNCH',
        time: 9
    }
];

const result = Array1.map(daypart => 
    ({ daypart, time: 0, ...Array2.find(e => e.daypart === daypart) })
);

console.log(result);