Как найти сумму элементов многомерного (произвольного) массива?
Дан такой массив let arr = [[1, 2, 3, [4, 5, [6, 7]]], [8, [9, 10]]];
Я насчитал три вложенности поэтому моё решение такое:
let arr = [
[1, 2, 3, [4, 5, [6, 7]]],
[8, [9, 10]]
];
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
for (let j = 0; j < arr[i].length; j++) {
sum += arr[i][j];
for (let k = 0; k < arr[i][j].length; k++) {
sum += arr[i][j][k];
}
}
}
console.log(sum);
Но что-то не так!Сумма получается бешеной. Подскажите мою ошибку и как было бы правильно? Как решать подобные задачи?
Ответы (3 шт):
Для того, чтобы посчитать сумму элементов массива произвольной вложенности, удобней сначала превратить его в плоский массив без всякой вложенности, а потом уже считать сумму его элементов.
Ваша же ошибка в том, что перед тем, как прибавить к сумме значение элемента массива, вы не проверяете, является ли оно действительно числом.
let arr = [
[1, 2, 3, [4, 5, [6, 7]]],
[8, [9, 10]]
];
let sum = 0;
arr = arr.flat(Infinity)
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
console.log(sum);
В дополнение к выше указаному коду смею предложить свой вариант в более декларативном функциональном стиле
const arr = [
[1, 2, 3, [4, 5, [6, 7]]],
[8, [9, 10]]
];
const sum = arr.flat(Infinity).reduce((acc, val) => acc + val, 0);
console.log(sum);
Основная проблема в том, что идет складывание числовых значение и вложенных массивов.
Для решения достаточно добавить проверку, что элемент является массивом, и в этом случае складывать его элементы.
Это хорошо выражается с помощью рекурсии
let arr = [
[1, 2, 3, [4, 5, [6, 7]]],
[8, [9, 10]]
];
console.log(sum(arr));
function sum(arr) {
return arr.reduce((acc, cur) => acc + (Array.isArray(cur) ? sum(cur) : cur), 0)
}
Также, можно обойтись и без рекурсии:
let arr = [
[1, 2, 3, [4, 5, [6, 7]]],
[8, [9, 10]]
];
let sum = 0;
while (arr.length) {
var cur = arr.shift();
if (Array.isArray(cur)) {
arr.unshift(...cur);
continue;
}
sum += cur;
}
console.log(sum);