嵌套数组使用深度计数器进行归一化

时间:2018-07-27 01:17:56

标签: javascript

我正试图解决遇到的这个问题,努力寻求解决方案:

问题:

  

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"}

3 个答案:

答案 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))