我有一个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;
}
答案 0 :(得分:2)
您可以将Array#reduce
与数组一起用作累加器,并将零指数归零,以获得以下项的总和。
基本上它将实际值与索引零的和值相加,并将实际值推送到累加器的末尾。
如果找到数组,则检查数组的长度为1,如果数组的第一个/唯一项是数组,则将项变量设置为子数组,依此类推。
然后使用相同的回调缩小数组,第一个元素的数组用于求和,其余用于数组的项目。
使用返回的数组,第一个项目被添加到实际的累加器第一个项目中,累加器将被整合到整个数组并返回。
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;
单一功能几乎相同
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;