【问题标题】:How to sum nested arrays in JavaScript如何在 JavaScript 中对嵌套数组求和
【发布时间】:2021-03-29 10:39:32
【问题描述】:
我正在尝试创建一个对数组中所有值求和的函数,即使这些值嵌套在嵌套数组中。像这样:
计数数组(数组); --> 28 (1 + 2 + 3 + 4 + 5 + 6 + 7)
我试过这个递归函数,但它只是连接起来。
var countArray = function(array){
var sum=0;
for(let i=0; i<array.length; i++){
if(array[i].isArray){
array[i]=countArray(array[i]);
}
sum+=array[i];
}
return sum;
}
【问题讨论】:
标签:
javascript
arrays
function
【解决方案1】:
使用Array.flat()将数组展平,然后使用Array.reduce()求和:
const countArray = array =>
array.flat(Infinity)
.reduce((sum, n) => sum + n, 0)
console.log(countArray([1, 2, [3, [4, 5], 6], 7]));
【解决方案2】:
- 使用
Array.isArray 检查对象是否为数组。
- 每次将递归调用的结果加到 sum 中。
var countArray = function(array) {
var sum = 0;
for (let i = 0; i < array.length; i++) {
if (Array.isArray(array[i])) {
sum += countArray(array[i]);
} else {
sum += array[i];
}
}
return sum;
}
console.log(countArray([1, 2, [3, [4, 5], 6], 7]));
您还可以将Array#reduce 与递归函数一起使用。
const countArray = array => array.reduce((acc,curr)=>
acc + (Array.isArray(curr) ? countArray(curr) : curr), 0);
console.log(countArray([1, 2, [3, [4, 5], 6], 7]));
这个问题可以简化为通过预先使用Array#flat 来查找一维数组中所有元素的总和。
const countArray = array => array.flat(Infinity).reduce((acc,curr)=>acc+curr, 0);
console.log(countArray([1, 2, [3, [4, 5], 6], 7]));
【解决方案3】:
除了Array.isArray的正确应用问题之外,您还有一个实际使用named function的用例,因为您递归地调用函数并且仅通过uzsing一个变量,函数的引用可能会消失。
function countArray(array) {
var sum = 0;
for (const value of array) {
sum += Array.isArray(value) ? countArray(value) : value;
}
return sum;
}
【解决方案4】:
使用 ramda:
const sumNested = compose(sum, flatten)
【解决方案5】:
您的工作示例:
const arr = [1, [2, [3]]]
const countArray = function(array) {
let sum = 0;
for (let i = 0; i < array.length; i++) {
if (Array.isArray(array[i])) {
sum += countArray(array[i]);
} else {
sum += array[i];
}
}
return sum;
}
console.log(countArray(arr));
稍微简化的例子:
const arr = [1, [2, [3]]]
const countArray = (array) => {
let sum = 0;
for (const el of array) {
sum += Array.isArray(el) ? countArray(el) : el
}
return sum;
}
console.log(countArray(arr));
更简单的代码:
const arr = [1, [2, [3]]]
const countArray = (array) =>
array.reduce((sum, el) =>
Array.isArray(el) ? sum + countArray(el) : sum + el, // reduce function
0); // sum = 0 intialization
console.log(countArray(arr));