使用reduce而不是for循环

时间:2017-09-13 17:43:22

标签: javascript angularjs arrays ecmascript-6

我想将此代码转换为使用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来获得同样的效果?

2 个答案:

答案 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]