#javascript #arrays #function #if-statement #multidimensional-array
#javascript #массивы #функция #if-оператор #многомерный массив
Вопрос:
У меня есть массив с именем 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.log(arr.length) // returns length = 2
console.log(total); // returns total = 3
Комментарии:
1. Потому
4
что это не массив. Таким образом, вы не можете перебирать его. Либо вам нужно будет обновить структуру[ [ 1,2 ], [ 4 ] ]
, либо обновить алгоритм2. это потому, что внутренний цикл пытается прочитать длину числа 4, которое не определено
Ответ №1:
Ваша проблема заключается в том, что ваш массив состоит не только из одних массивов, он состоит как из отдельных чисел, так и из вложенных массивов. В результате ваш внутренний цикл не сможет перебирать число 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.log(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.log(result); // 7
Ответ №2:
Поскольку значениями могут быть массив или числа, просто добавьте проверку перед выполнением внутреннего цикла
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.log(arr.length) // returns length = 2
console.log(total);