У меня есть массив с именем arr = [[1,2],4] и циклы for для доступа к числам. Но я не могу добавить последнюю цифру. Почему это не работает?
let arr = [[1,2],4];
let total = 0;
for(let i = 0; i < arr.length; i++) {
for(let j = 0; j < arr[i].length; j++) {
total += arr[i][j];
}
}
console.info(arr.length) // returns length = 2
console.info(total); // returns total = 3
это потому, что внутренний цикл пытается прочитать длину числа 4, которая не определена
Ваша проблема в том, что ваш массив состоит не только из массивов, он состоит как из одиночных чисел, так и из вложенных массивов. В результате ваш внутренний цикл не сможет перебрать число 4
, поскольку оно не является массивом (и поэтому у него не будет свойства .length
).
let arr = [[1,2],4];
// no issues-^ ^-- no `.length` property (inner for loop won't run)
Для решения такой проблемы вы можете использовать рекурсивную функцию, которая, когда вы столкнетесь с вложенным массивом, вы можете вызвать свою функцию для выполнения добавления для этого массива.
См. пример ниже (и комментарии к коду):
function sumNums(arr) {
let total = 0;
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) { // If current element (arr[i]) is an array, then call the sumNums function to sum it
total += sumNums(arr[i]);
} else {
total += arr[i]; // If it is not an array, then add the current number to the total
}
}
return total;
}
let arr = [[1,2],4];
console.info(sumNums(arr)); // 7
Вы также можете использовать рекурсивный вызов с .reduce(), если вы хотите использовать этот подход:
const arr = [[1,2],4];
const result = arr.reduce(function sum(acc, v) {
return acc + (Array.isArray(v) ? v.reduce(sum, 0) : v);
}, 0);
console.info(result); // 7
Поскольку значения могут быть массивом или числами, просто добавьте проверку перед выполнением внутреннего цикла.
if (!Array.isArray(arr[i])) {
total += arr[i];
continue;
}
let arr = [[1,2],4];
let total = 0;
for(let i = 0; i < arr.length; i++) {
if (!Array.isArray(arr[i])) {
total += arr[i];
continue;
}
for(let j = 0; j < arr[i].length; j++) {
total += arr[i][j];
}
}
console.info(arr.length) // returns length = 2
console.info(total);
Потому что
4
это не массив. Таким образом, вы не можете зацикливаться на нем. Либо вы обновите структуру до[ [ 1,2 ], [ 4 ] ]
, либо обновите алгоритм