【问题标题】:use reduce instead of for loop [closed]使用reduce而不是for循环[关闭]
【发布时间】:2018-02-22 12:50:44
【问题描述】:
我想将此代码转换为使用 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 获得相同的输出?
【问题讨论】:
标签:
javascript
angularjs
arrays
ecmascript-6
【解决方案1】:
您将使用.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 ]
【解决方案2】:
您可以使用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]