我想将此代码转换为使用reduce而不是for循环。
var a = [1, 2, 30, 4, 5, 6];
var add = 0;
var r = [];
for (var i = 0; i < a.length; i++) {
add = 0;
for (var j = 0; j < i; j++) {
add += a[j];
}
if (a[i] > add) {
r.push(a[i]);
}
}
console.log(r); // => [ 1, 2, 30 ]
我们如何使用reduce来获得同样的效果?
答案 0 :(得分:2)
您使用.filter()
,它会执行特定的减少,以将设置减少为较小的值子集。并在过滤器回调中使用.reduce()
来将数字加到该点。
var a = [1, 2, 30, 4, 5, 6];
var r = a.filter((n, i, arr) =>
n > arr.slice(0, i).reduce((s, nn) => s + nn, 0)
)
console.log(r); // => [ 1, 2, 30 ]
内部.reduce()
实际上有点多余,因为它每次只是总和一个额外的值。为避免这种情况,您可以引用外部变量并继续添加它。
var a = [1, 2, 30, 4, 5, 6];
var s = 0;
var r = a.filter((n, i, arr) => {
s = i && (s + arr[i-1]);
return n > s
})
console.log(r); // => [ 1, 2, 30 ]
答案 1 :(得分:1)
您可以使用Array#reduce
收集前一项的总和,并检查该值是否必须推送到结果集。
var array = [1, 2, 30, 4, 5, 6],
result = [];
array.reduce((r, a) => (a > r && result.push(a), r + a), 0);
console.log(result); // [1, 2, 30]