#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. объяснение часто бывает полезным