我正试图解决遇到的这个问题,努力寻求解决方案:
问题:
const arr = [4,[3,1],1,[[2],1]];
我们需要汇总所有元素*元素的深度。
例如,对于[4,[3,1],1,[[2],1]] = 4 * 1 + 3 * 2 + 1 * 2 + 1 * 1 + 2 * 3 + 1 * 2 = 21
这是我的解决方案,但是,我没有获得正确的价值。有人可以使用ES5和ES6解决此问题吗?
{id:"1"}
答案 0 :(得分:2)
您可以使用reduce()
const b = [4, [3,1],1,[[2], 1]];
function addNormalize(arr, depth = 1){
if (arr.length == 0) return 0
return arr.reduce((a,item) => a + (Array.isArray(item) ? addNormalize(item, depth+1) : depth * item), 0)
}
console.log(addNormalize(b))
答案 1 :(得分:1)
代码无法正常工作的原因非常简单。原始值(例如字符串,布尔值,整数,浮点数等)不是passed by reference
而是值。这意味着将值复制为不可变值(您可以在另一个函数作用域中更改原始值)
您应该接收由以下调用的递归函数返回的值:
if (Array.isArray(cur)) {
depth+=1;
sum += addNormalize(cur, sum);
}
或将总和更改为一个对象,以使总和通过引用传递。
答案 2 :(得分:1)
我对您的代码进行了一些更正,您正试图通过传递“引用”来计算结果,而在使用JavaScript的原语中无法做到这一点,而且您也没有将深度传递给递归调用。
const b = [4, [3,1],1,[[2], 1]]; // 4*1 + 3*2 + 1*2 + 1*1 + 2*3 + 1*2
function addNormalize(arr, depth=1) {
let sum=0;
for(let i=0; i< arr.length; i++) {
const cur = arr[i];
if (Array.isArray(cur)) {
sum += addNormalize(cur, depth+1);
} else {
sum+=cur * depth;
}
}
return sum;
}
console.log(addNormalize(b))