使用sum返回只有一个级别的数组变平

时间:2017-11-30 12:40:49

标签: javascript

我有一个lodash flatten函数,但我需要将所有嵌套数组的总和添加到结果中。

例如,对于这个AoA:

[[[1,2,3],[1,5]], [[1,1,2]]] 

结果应为:

[16,12,6,1,2,3,6,1,5,4,1,1,2]

这样做的有效方法是什么?

这是我到目前为止所做的,但它只返回一个等级:

function buildDataFromAOA(aoa) {
    if (!aoa[0].length) 
        return [aoa.reduce((sum, item) => sum += item, 0)].concat(aoa);

    let data = [];
    for (var i = 0; i < aoa.length; i++) {
        data = data.concat(buildDataFromAOA(aoa[i]))
    }

    return data;
}

1 个答案:

答案 0 :(得分:2)

您可以将Array#reduce与数组一起用作累加器,并将零指数归零,以获得以下项的总和。

基本上它将实际值与索引零的和值相加,并将实际值推送到累加器的末尾。

如果找到数组,则检查数组的长度为1,如果数组的第一个/唯一项是数组,则将项变量设置为子数组,依此类推。

然后使用相同的回调缩小数组,第一个元素的数组用于求和,其余用于数组的项目。

使用返回的数组,第一个项目被添加到实际的累加器第一个项目中,累加器将被整合到整个数组并返回。

&#13;
&#13;
var array = [[[1, 2, 3], [1, 5]], [[1, 1, 2]]],
    result = array.reduce(function fn(r, a) {
        var t;
        if (Array.isArray(a)) {
            while (a.length === 1 && Array.isArray(a[0])) { a = a[0]; }
            t = a.reduce(fn, [0]);
            r[0] += t[0];
            return r.concat(t);
        }
        r[0] += a;
        r.push(a);
        return r;
    }, [0]);

console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

单一功能几乎相同

&#13;
&#13;
function fn(array) {
    var result = [0];

    while (array.length === 1 && Array.isArray(array[0])) {
        array = array[0];
    }
    array.forEach(function (a) {
        var t;
        if (Array.isArray(a)) {
            t = fn(a);
            result[0] += t[0];
            Array.prototype.push.apply(result, t);
            return;
        }
        result[0] += a;
        result.push(a);
    });
    return result;
}

console.log(fn([[[1, 2, 3], [1, 5]], [[1, 1, 2]]]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;