Создание массива массивов объектов из массива объектов

#javascript #arrays

#javascript #массивы

Вопрос:

В настоящее время мои данные представляют собой массив с длинным списком объектов в формате:

 [ 
    { name: 'example' },
    { name: 'example' },
    ...
]
 

То, что я пытаюсь сделать, это преобразовать этот список в массивы массивов объектов с заданным интервалом, 20.

Я хочу этот формат:

 [
  [
   { name: 'example' },
   { name: 'example' },
    ...18 more rows
   ],
  [
   { name: 'example' },
   { name: 'example' },
    ...18 more rows
  ],
]

 

chartdata содержит данные в исходном формате, я пытаюсь получить новый формат в ‘newArray’. Для достижения этой цели я поставил:

   let newArray = [];
  let data = [];

  chartdata.forEach((x, i) => {
    if(i === chartdata.length - 1 ){
      newArray.push(data)
      data = []
    }
    if(i%20===0){
      newArray.push(data)
      data = []
    }
    data.push(x);
  })
  console.log('newArray',newArray)

 

Есть две вещи, которые я не понимаю.

В журнале консоли показано следующее:

введите описание изображения здесь

Почему в первом индексе newArray есть пустой массив?

  • Спасибо, я добавил amp;amp; i !== 0 во второй оператор if .

Почему индекс 4 newArray имеет только 19 значений?

Первый вопрос довольно легко решить, однако второй вопрос я не понимаю, как исправить. Пожалуйста, кто-нибудь может оказать некоторую помощь?

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

1. Первый массив является пустым bcoz 0 = 0 , поэтому 2-е условие становится истинным, и пустой массив помещается в конечный массив

2. forEach((x,i) => {}) Здесь, в этой строке x — текущий элемент, а I — его индекс. Индексы начинаются с 0 в Javascript. Следовательно, для первого элемента x индекс i= 0 amp; i === 0 является истинным (поскольку 0 равно 0) и, следовательно, пустой массив данных, который инициализируется во 2-й строке кода, помещается в newarray, и именно поэтому индекс 0 newarray является пустым массивом.

Ответ №1:

Если вы открыты для интеграции других пакетов в проект, я полагаю, что функция chunk от Lodash служит именно этой цели: https://lodash.com/docs/4.17.15#chunk

Код становится таким же простым, как (и намного понятнее с точки зрения того, что происходит):

 const chunks = _.chunk(chartdata, 20);
 

В общем, поскольку кажется, что вы будете много работать с массивами, подумайте об интеграции Lodash в свой проект, библиотека предназначена именно для тех операций, которые нужно было бы выполнить с массивами. Я уже несколько лет работаю с библиотекой в своих проектах, и вряд ли когда-либо (если вообще когда-либо) сталкивался с операцией, которая не была охвачена их функциями.

Есть несколько предложений относительно оптимизации, но, честно говоря, я никогда не считал, что импорт всей библиотеки является проблемой, когда дело доходит до размера пакета.

Ответ №2:

 let i,j, newArray = [],chunk = 20;
for (i=0,j=chartdata.length; i<j; i =chunk) {
    newArray.push(chartdata.slice(i,i chunk));
}
 

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

1. объяснение часто бывает полезным