- 求和包含嵌套数组的数组中的所有数字
- arraySum([1,[2,3],[[4]],5](;//15
到目前为止我已经写了这篇文章。。
var newArray = array.slice();
newArray = newArray.flat(Infinity);
var sum = 0;
if (newArray.length === 1) {
return array[0];
}
if (newArray.length === 0) {
return 0;
}
for (var i = 0; i < newArray.length; i++) {
if (typeof newArray[i] === "number") {
sum += newArray[i];
}
}
return arraySum(newArray);
};
如果我输入返回和,它是完美的,但是这个练习需要递归。
如果要使用递归,则将for
循环替换为返回数组第一个元素的值,再加上数组中其他元素的总和:
const arraySum = (array) => {
var newArray = array.slice();
newArray = newArray.flat(Infinity);
var sum = 0;
if (newArray.length === 1) {
return array[0];
}
if (newArray.length === 0) {
return 0;
}
return array[0] + arraySum(newArray.slice(1));
};
console.log(arraySum([1,[2,3],[[4]],5]));
但是.flat
在每次迭代中的表现似乎都很奇怪。考虑只做一次,在传递的第二个默认参数中:
const arraySum = (arr, arrFlat = arr.flat(Infinity)) => {
return arrFlat.length
? arrFlat[0] + arraySum(arr, arrFlat.slice(1))
: 0;
};
console.log(arraySum([1,[2,3],[[4]],5]));
或者检查当前被迭代的元素是否是一个数组,而不是使用.flat
,看看是否需要使用对arraySum
的另一个递归调用来迭代子数组,或者只添加数字:
const arraySum = (arr) => {
if (!arr.length) return 0;
const rest = arraySum(arr.slice(1));
return typeof arr[0] === 'number'
? arr[0] + rest
: arraySum(arr[0]) + rest;
};
console.log(arraySum([1,[2,3],[[4]],5]));