Я создал следующее JSFiddle , чтобы продемонстрировать мой подход к вашему вопросу.
(function() {
// Sample arrays
var //elements = ["0", "1", "2", "3", "4", "5", "6", "7"],
elements = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43"];
var splitElements = [],
delimiter = 10; // Change this value as needed
// parameters: array, number of elements to split the array by
if(elements.length > delimiter){
splitElements = splitArray(elements, delimiter);
}
else {
// No need to do anything if the array's length is less than the delimiter
splitElements = elements;
}
//Displaying result in console
for(element in splitElements){
if(splitElements.hasOwnProperty(element)){
console.log(element + " | " + splitElements[element]);
}
}
})();
function splitArray(elements, delimiter) {
var elements_length = elements.length;
if (elements_length > delimiter) {
var myArrays = [], // parent array, used to store each sub array
first = 0, // used to capture the first element in each sub array
index = 0; // used to set the index of each sub array
for (var i = 0; i < elements_length; ++i) {
if (i % delimiter === 0) {
// Capture the first element of each sub array from the original array, when i is a modulus factor of the delimiter.
first = i;
} else if (delimiter - (i % delimiter) === 1) {
// Build each sub array, from the original array, sliced every time the i one minus the modulus factor of the delimiter.
index = (i + 1) / delimiter - 1;
myArrays[index] = elements.slice(first, i + 1);
}
else if(i + 1 === elements_length){
// Build the last sub array which contain delimiter number or less elements
myArrays[index + 1] = elements.slice(first, i + 1);
}
}
// Returned is an array of arrays
return myArrays;
}
}
Прежде всего, у меня есть два примера: массив с менее чем восемью элементами, другой с массивом с более чем восемью элементами (прокомментируйте тот, который вы не хотитеиспользовать).
Затем я проверяю размер массива, простой, но необходимый, чтобы избежать дополнительных вычислений.Отсюда, если массив соответствует критериям (размер массива> delimiter
), мы переходим в функцию splitArray
.
Функция splitArray
принимает разделитель (имеется в виду 8, поскольку это то, что вы хотитеразделить на), и сам массив.Поскольку мы многократно используем длину массива, я кеширую его в переменной, а также first
и last
.
first
представляет позицию первого элемента вмассив.Этот массив представляет собой массив из 8 элементов.Таким образом, для определения первого элемента мы используем оператор модуля .
myArrays
- массив массивов.В нем мы будем хранить в каждом индексе любой вложенный массив размером 8 или ниже.Это ключевая стратегия в алгоритме ниже.
index
представляет индекс для переменной myArrays
.Каждый раз, когда необходимо сохранить подмассив из 8 элементов или менее, его необходимо сохранить в соответствующем индексе.Итак, если у нас есть 27 элементов, это означает, что 4 массива.Первый, второй и третий массив будут иметь 8 элементов каждый.Последний будет иметь только 3 элемента.Таким образом, index
будет 0, 1, 2 и 3. соответственно.
Сложная часть просто вычисляет математику и оптимизирует ее как можно лучше.Например, else if (delimiter - (i % delimiter) === 1)
это найти последний элемент, который должен идти в массиве, когда массив будет заполнен (пример: содержит 10 элементов).
Этот код работает для каждого отдельного сценария, вы даже можетеизмените delimiter
, чтобы он соответствовал размеру любого массива, который вы хотите получить.Довольно мило, правда: -)
Есть вопросы?Не стесняйтесь спрашивать в комментариях ниже.