Создать объект, сгладив массив в его свойствах - PullRequest
1 голос
/ 05 марта 2020

Мне нужно создать массив объектов, где каждый отдельный объект содержит только одно значение массива свойств.

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

Первый элемент массива содержит все свойства и только первое значение массива. Каждый после первого должен иметь уникальный идентификатор и новое свойство (например, ссылку), относящееся к идентификатору первого элемента.

INPUT:

const series = [
{
   id: 1,
   name: 'game of thrones',
   ep: ['01-01-2020','04-03-2020'] // This is the array that will split
},
{
   id: 2,
   name: 'stranger things',
   ep: ['03-02-2020']
}
]

ОЖИДАЕМЫЙ ВЫХОД:

const newSeries = [
{
   id: 1, // same id as before
   name: 'game of thrones', // same name as before
   ep: ['01-01-2020'] // first element of the previous array
},
{
   id: 2, // untouched
   name: 'stranger things',
   ep: ['03-02-2020']
},
{
   id: 35, // Any id
   ep: ['04-03-2020'] // second element
   link: 1 // This is the id of the original element
   // name is not necessary
}
// If ep had 3 dates, it would make a new element 
]

Я не против порядка объекта. Если бы в массиве было больше элементов, он продолжал бы, пока не будет только один.

РЕДАКТИРОВАТЬ: Забыл отправить мою попытку:

series.forEach(x => x.ep.map(epdate=> 
         newarray = [...newarray, {id:'some id', ep: epdate, link: x.id}]
    ))

Мне удается разделить массив, но я пропустите логи c, чтобы узнать, является ли элемент первым и нужно ли сохранить имя или, если после первого, и нужно иметь ссылку. Кроме того, мне нужно создать случайный идентификатор, который должен быть уникальным.

Удалось заставить его работать с этим кодом:

serie.forEach(x => {
    x.ep.length > 1 ? 
    x.ep.map(y => 
        y === x.ep[0] ? 
         newarray = [...newarray, {id: x.id, name: x.name, ep: y}] :
        newarray = [...newarray, {id: 'id', ep: y, link: x.id}])
     : 
    newarray = [...newarray, {...x, ep: x.ep[0]}]
})

Единственной проблемой было бы то, что идентификатор не был уникальным. Я также рекомендую проверить ответ Кальвина, так как он чрезвычайно ясен и понятен с точки зрения кода.

1 Ответ

2 голосов
/ 05 марта 2020

Существует более одного подхода, но мне всегда нравится использовать старые старомодные циклы for вместо синтаксиса ES6 (на мой взгляд, для лучшей читаемости), но давайте посмотрим:

Использование for до l oop вашего series массива, проверьте его ep, чтобы увидеть, если длина больше 1.
Если да, то вы можете сделать следующие шаги:

  1. Получить ep массив в новую переменную
  2. Pu sh serie объект для результирующего массива (newSeries)
  3. Использование другого for для l oop ep массив (начиная с индекса 1, так как индекс 0 останется в исходном ser ie)
  4. Внутри этого l oop создайте новый объект и установите нужные свойства
  5. Pu sh этот новый объект в newSeries

Если нет, то просто pu sh, что serie объект на newSeries.

const series = [
  { id: 1, name: 'game of thrones', ep: ['01-01-2020', '04-03-2020', '01-05-2020']},
  { id: 2, name: 'stranger things', ep: ['03-02-2020']}
]

let newSeries = [];
let idCounter = series.length + 1;

for (let i = 0; i < series.length; i++) {
  let serie = series[i]

  if (serie.ep.length > 1) {
    let allEps = serie.ep;
    serie.ep = [serie.ep[0]]
    newSeries.push(serie);

    for (let j = 1; j < allEps.length; j++) {
      let newSerieObj = {};
      newSerieObj.id = idCounter;
      newSerieObj.ep = [allEps[j]]
      newSerieObj.link = serie.id;
      newSeries.push(newSerieObj);
      idCounter++;
    }
  } 
  else {
    newSeries.push(serie)
  }
}

console.log(newSeries)
.as-console-wrapper {
  min-height: 100%
}

Примечание : Я использую переменную idCounter просто для примера. Вы можете использовать свой собственный лог c для установить новые идентификаторы.

Если вы хотите, чтобы созданные объекты (с новым идентификатором) всегда были последними в массиве, у вас есть два варианта: .sort по идентификатору; или не pu sh to newSeries, а другой массив, и просто .concat этот другой массив после завершения всех циклов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...