Разделить массив на чанки
Изначальная задача : Разбить на чанги массив Пример правильного выполнения кода: [9342,259,358,452,4292,57] ===>>> [[9342,259,358],[452,4292,57]]
let array1 = [9342, 259, 358, 452, 4292, 57, 7, 8, 9];
let array0 = array1;
let suport = [];
let x = [];
let k = 0;
let i = 0;
for (k = 0; k < 3; k++) {
for (i = 0; i < 3; i++) {
suport[i] = array0.shift();
}
x[k] = suport;
console.log(x[k], "<---------");
console.log(suport, "<=============");
}
console.log("-----------------------------------");
console.log(x[0]);
console.log(x[1]);
console.log(x[2]);
console.log(x);
Не могу понять почему в ячейках x[0] , x[1] , x[2] во время цикла одно значение, а когда цикл заканчивается, первые две ячейки принимают значение последней(x[2]). Очень принципиальный вопрос. Почему так не работает!? Слишком много времени потратил на поиск в инете, уже и ценность написания кода пропала, лишь бы знать ответ почему так происходит!!! Сильно не ругайте, и ногами не бейте, только пробую себя в js
Ответы (2 шт):
Когда создается массив (также объект, функция) — выделяется конкретный адрес в памяти, через который можно получить доступ к массиву. Операция присваивания не создает новый массив, а лишь копирует адрес (ссылку на массив) в переменную. Несколько переменных могут ссылаться на один и тот же массив, и менять его значения.
Демо:
let a = [0, 0, 0];
let b = a;
let c = a;
b[0] = 10;
c[1] = 50;
console.log( a ); // [10, 50, 0]
// a, b, c — ссылки на один массив.
Ошибки в коде:
let array1 = [9342, 259, 358, 452, 4292, 57, 7, 8, 9];
let array0 = array1; // <---(1.1) всё равно в итоге работаем с array1
let suport = []; // <---(2.1)
let x = [];
let k = 0;
let i = 0;
for (k = 0; k < 3; k++) {
for (i = 0; i < 3; i++) {
suport[i] = (array0.shift()); // <---(1.2) удаляются элементы array1
}
x[k] = suport; // <---(2.2)
// x[0], x[1], x[2] ссылаются на тот же массив support
}
Лечение: На каждой итерации создавать новый массив.
let array = [9342, 259, 358, 452, 4292, 57, 7, 8, 9, 0];
let x = [], size = 3;
for (let k = 0; k < array.length / size; k++) {
let chunk = []; // <---
for (let i = 0; i < size; i++) {
let index = k * size + i; // <--- Фокус) shift() не нужен.
if (index >= array.length) break; // элементы закончились.
chunk[i] = array[index];
}
x[k] = chunk;
}
console.log( x );
code { white-space: nowrap !important }
let chunk = []; — Можно сразу заменить на x[k] = []; ... x[k][i] = array[index];
P.s. Если действительно надо будет создать новый массив с такими же значениями, а не просто копировать ссылку, let arr2 = arr1.slice(0); или let arr2 = [...arr1]
Задачу разбития массива на группы можно выполнить следующим простым образом:
let input = [9342,259,358,452,4292,57,7,8,9], // Ваш массив
size = 3, // Длина "чанка"
output = []; // результат
// Выполняем цикл : (длина массива / длина чанка) = кол-во шагов
for(let i = 0; i < (input.length / size); i++) {
output[i] = input.slice(i*size, i*size+size);
// Добавляем новое значение в исх.массив, которое равно - часть массива из входящего массива от i*size (текущая) позиции до текущая + size, это будет массив.
}
console.info(output);