簡體   English   中英

展平數組,總和僅返回一級

[英]Flatten array of array with sum returning only one level

我有一個lodash展平函數,但是我需要將所有嵌套數組的總和添加到結果中。

例如,對於此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;
}

您可以將Array#reduce與一個數組作為累加器一起使用,並在下標零的總和處取零。

基本上,它將實際值與索引零的總和相加,然后將實際值推入累加器的末尾。

如果找到一個數組,則檢查該數組的長度,如果數組的第一個/唯一項是數組,則將item變量設置為子數組,依此類推。

然后,使用相同的回調對數組進行歸約,並使用具有第一個元素的數組進行求和,其余元素用於數組的項。

對於返回的數組,將第一項添加到實際累加器的第一項,然后將累加器代入整個數組並返回。

 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); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

單個功能幾乎相同

 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]]])); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM