Допустим, у меня есть массив, и я хочу перебирать их по N за раз. Я могу использовать простой вложенный цикл
const array = ['a','b','c','d','e','f','g','h'];
const step = 3;
for (let i = 0; i < array.length; i += step) {
const end = Math.min(i + step, array.length);
console.log("page:", i / step);
for (let j = i; j < end; ++j) {
const element = array[j];
console.log(" ", element);
}
}
выходы:
page: 0
a
b
c
page: 1
d
e
f
page: 2
g
h
Но мне интересно, есть ли более современный способ, например forEach, в JavaScript в наши дни. Представлять себе:
// pseudo code
const chunkSize = 3
forEachByChunk(array, chunkSize, (subArray, chunkNdx, startingNdxInParentArray) => {
console.log("page:", chunkNdx);
subArray.forEach((element) => { console.log(" ", element); });
});
Примечание: я могу написать свой собственный forEachByChunk
function forEachByChunk(array, chunkSize, fn) {
const end = array.length;
for (let i = 0; i < end; i += chunkSize) {
fn(array.slice(i, i + chunkSize), i / chunkSize, i);
}
}
Мне просто интересно, нет ли уже встроенного современного способа сделать это в JavaScript. Или, может быть, более универсальная версия.
for
, как в первом примере. Добавление к нативным прототипам, как правило, тоже не очень хорошая идея. - person adeneo   schedule 27.08.2017slice
для создания чанка, вы перебираете каждый элемент чанка, чтобы все равно его скопировать. - person Aadit M Shah   schedule 27.08.2017.bind()
функций. По вашим рассуждениям нет веской причины иметь это на языке, потому что вы можете его реализовать. Для итератора фрагментов вы определенно можете повысить производительность, реализовав его на C. - person slebetman   schedule 27.08.2017stride
? Тот факт, что JavaScript предоставляетbind
, не означает, что он должен предоставлять все удобные функции. Во-вторых, не нужно беспокоиться о производительности, потому что современные движки JavaScript уже сильно оптимизируют циклы. Независимо от того, реализуете ли вы итератор фрагментов в JavaScript или в C, производительность будет относительно одинаковой. В-третьих, как правило, производительность итератора фрагментов никогда не является узким местом в любом алгоритме. Преждевременная оптимизация? - person Aadit M Shah   schedule 27.08.2017