[英]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.