Как одномерный массив преобразовывать в двухмерный js?
Подскажите как реализовать функцию, которая будет первым параметром принимать одномерный массив, а вторым - желаемое количество элементов в подмассиве и преобразовывать его в двухмерный.
Например такой массив
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
а хотим получить
let array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
и чтобы не возникло ошибки, если вдруг нам не хватит элементов на равное разделение.
Ответы (3 шт):
Алгоритм: проходимся по каждому значению исходного массива, проверяя при этом надо ли создавать новый вложенный массив. И вставляем в конец текущий элемент.
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
function makeNestedArray(arr, pivot) {
return arr.reduce((a, c, i) => {
if (i % pivot === 0) {
a.push([]);
}
return a[a.length - 1].push(c), a;
}, []);
}
console.log(makeNestedArray(arr, 4));
console.log(makeNestedArray(arr, 20));
console.log(makeNestedArray(arr, 10));
Ещё вариант:
function get2dimensional(array, limit) {
const array2 = [];
let section;
for (const [index, element] of array.entries()) {
if (index % limit === 0) array2.push(section = []);
section.push(element);
}
return array2;
}
console.log(get2dimensional([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 4));
console.log(get2dimensional([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 5));
Так как задано количество элементов в подмассиве, можно воспользоваться методом .slice, чтобы получить подмассив, с заданным количеством элементов.
В этом случае уменьшится количество итераций в цикле, за счет того, что не надо проверять индекс каждого элемента:
function get2dimensional(array, limit) {
const result = [];
for (var i = 0; i < array.length; i += limit) {
result.push(array.slice(i, i + limit));
}
return result;
}
console.log(get2dimensional([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 4));
console.log(get2dimensional([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 5));