Увеличение вложенности массива с каждой итерацией JavaScript
Стоит задача создать массив, с каждой итерацией его вложенность должна увеличиваться:
Массив такого вида:
- ar[0] содержит 3 числа;
- ar[1] содержит 3 массива, в каждом 3 числа;
- ar[2] содержит 3 массива, в каждом 3 массива, в каждом 3 числа;
- ar[3] содержит 3 массива, в каждом 3 массива, в каждом 3 массива, в каждом 3 числа;
и т.д.
В общем вид на подобии этого:
var ar = [
[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,44,45],
[46,47,48],
],
...
],
...
]
Пытался реализовать это через рекурсивную функцию, но не выходит, что можете посоветовать? Буду рад любой подсказке!
Ответы (2 шт):
Можно реализовать таким образом. Сделал с помощью вспомогательной рекурсивной функции, которая сначала чанкует массив по три значения. Промежуточный результат будет следующим:
// [[1, 2, 3], [4, 5, 6], [7, 8, 9]] и так далее
Следующая же функция чанкует элементы промежуточного массива, кроме первого элемента. Функция так же является рекурсивной.
const arr = [
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, 44, 45, 46, 47, 48
];
const makeChunks = (arr) => {
if (arr.length === 0) {
return [];
}
const chunk = arr.slice(0, 3);
const restArray = arr.slice(3);
return [chunk, ...makeChunks(restArray)];
};
const intermediateResult = makeChunks(arr);
const increaseArrayNesting = (arr) => {
if (arr.length === 0) {
return [];
}
const [head, ...tail] = arr;
const chunkedRestArray = makeChunks(tail);
return [head, ...increaseArrayNesting(chunkedRestArray)];
};
console.log(increaseArrayNesting(intermediateResult));
Уверен, что можно сделать одну функцию для решения задачи или же решить изящнее. По крайней мере задам направление. Надеюсь, в скобках не запутался при проверке)
А я подумал в эту сторону:
[0,0,0], // ← a
[
[0,0,0], // ← a
[0,0,0], // ← a
[0,0,0], // ← a
], // ← b
[
[[0,0,0],[0,0,0],[0,0,0]], // ← b
[[0,0,0],[0,0,0],[0,0,0]], // ← b
[[0,0,0],[0,0,0],[0,0,0]], // ← b
]
Т.е. каждый следующий элемент массива должен содержать три элемента, похожих на предыдущий элемент, которые отличаются только наполнением-числами. Можно пока решать вопрос со вложенностью, а с заполнением разберемся потом?)
В итоге, решилось так:
let nesting_level = 5; // Уровень вложенности;
let arr = [], n = 1, last = "0";
for (let i = 0; i < nesting_level; i++ ) {
let curr = `[${last},${last},${last}]`.replace(/\d+/g, _ => n++);
arr.push( JSON.parse(curr) );
last = curr;
}
console.log(arr);
На каждом круге создается строка, похожая на массив, содержащая три одинаковых, предыдущих элемента. Оттуда все совпадения с числами заменяются на нужное число. Ура!)
P.s. При желании, создание каждого нового массива, и его заполнение числами - можно заменить на отдельную рекурсию.