Заменить массив объектов - PullRequest
0 голосов
/ 12 ноября 2018

у меня ниже массива объектов

const array = [
   { home1: "05:45", dayOfWeek: 1, away: "09:30"},
   { home1: "05:15", dayOfWeek: 2, away: "09:30"},
   { home1: "17:30", dayOfWeek: 5, away: "09:30"},
   { home1: "16:30", dayOfWeek: 7, away: "09:30"}
]

у меня четыре dayOfWeek (1,2,5,7). Теперь мне нужно подтолкнуть оставшиеся три (3,4,6) с помощью фиктивного объекта ({ home1: "05:30", dayOfWeek: 7, away: "09:30"})

Теперь логическая часть: я не знаю, какие dayOfWeek присутствуют в массиве. Там может быть только один, два, три или пусто. Мне нужно каждый раз помещать 7 дней в этот массив.

Как это можно сделать? Пожалуйста, предложите мне лучший способ

Спасибо !!!

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

Сначала вы можете получить все dayOfWeek , представленные в массиве с map(). Затем используйте для цикла , чтобы вставить dayOfWeek , проверив, присутствует ли он в массиве или нет.

Вы можете попробовать следующий способ:

const array = [
   { home1: "05:45", dayOfWeek: 1, away: "09:30"},
   { home1: "05:15", dayOfWeek: 2, away: "09:30"},
   { home1: "17:30", dayOfWeek: 5, away: "09:30"},
   { home1: "16:30", dayOfWeek: 7, away: "09:30"}
]
let exist = array.map(d => d.dayOfWeek);

for(let i = 1; i<=7; i++){
  let dummy = { home1: "05:30", dayOfWeek: 7, away: "09:30"};
  dummy.dayOfWeek = i;
  if(!exist.includes(i))
   array.splice(i-1, 0, dummy);
}
console.log(array);
0 голосов
/ 12 ноября 2018

Вы можете использовать «Array.from» и выполнить цикл 7 раз, как показано ниже.

const array = [
   { home1: "05:45", dayOfWeek: 1, away: "09:30"},
   { home1: "05:15", dayOfWeek: 2, away: "09:30"},
   { home1: "17:30", dayOfWeek: 5, away: "09:30"},
   { home1: "16:30", dayOfWeek: 7, away: "09:30"}
]

// sort array by day of week. Ignore this step if you are sure it will be sorted always
array.sort((a,b) => a.dayOfWeek - b.dayOfWeek)

var result = Array.from({ length: 7}
    , (_,i) => array[0].dayOfWeek == i + 1
                ? array.shift()
                : { home1: "05:30", dayOfWeek: i + 1, away: "09:30"})
                
console.log(result)
0 голосов
/ 12 ноября 2018

Используйте Array.reduce , чтобы создать набор существующих дней.Теперь итерируем и проверяем, есть ли запись в множестве, если не выдвигаем объект в массив.

const array = [
   { home1: "05:45", dayOfWeek: 1, away: "09:30"},
   { home1: "05:15", dayOfWeek: 2, away: "09:30"},
   { home1: "17:30", dayOfWeek: 5, away: "09:30"},
   { home1: "16:30", dayOfWeek: 7, away: "09:30"}
];
let daysSet = array.reduce((a,c) => a.add(c.dayOfWeek), new Set());
let obj = { home1: "16:30", dayOfWeek: 7, away: "09:30"};
for(let i = 1; i <=7; i++) {
  if(!daysSet.has(i)) array.push(Object.assign({}, obj, {dayOfWeek:i}));
}
console.log(array);
0 голосов
/ 12 ноября 2018

Один из вариантов - сделать Set дней, содержащихся в массиве, а затем выполнить итерацию от 1 до 7, push, добавляя новый объект в массив с этим днем, если он не содержится в наборе. :

const array = [
   { home1: "05:45", dayOfWeek: 1, away: "09:30"},
   { home1: "05:15", dayOfWeek: 2, away: "09:30"},
   { home1: "17:30", dayOfWeek: 5, away: "09:30"},
   { home1: "16:30", dayOfWeek: 7, away: "09:30"}
];
const dummy = { home1: "05:30", away: "09:30" };
const days = new Set(array.map(({ dayOfWeek }) => dayOfWeek));
for (let i = 1; i <= 7; i++) {
  if (!days.has(i)) array.push({ ...dummy, dayOfWeek: i });
}
console.log(array);

Я использовал Set для уменьшения сложности, но я полагаю, что если вам когда-нибудь понадобится всего 7 объектов, это не имеет большого значения, вы можете использовать find вместо того, чтобы заранее создавать коллекцию

const array = [
   { home1: "05:45", dayOfWeek: 1, away: "09:30"},
   { home1: "05:15", dayOfWeek: 2, away: "09:30"},
   { home1: "17:30", dayOfWeek: 5, away: "09:30"},
   { home1: "16:30", dayOfWeek: 7, away: "09:30"}
];
const dummy = { home1: "05:30", away: "09:30" };
for (let i = 1; i <= 7; i++) {
  if (!array.find(({ dayOfWeek }) => dayOfWeek === i)) {
    array.push({ ...dummy, dayOfWeek: i });
  }
}
console.log(array);
...