【问题标题】: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 获得相同的输出?

【问题讨论】:

  • 你尝试过与reduce相关的事情吗?
  • 输出[1,2,30]的逻辑是什么
  • a.splice(0,a.length/2)

标签: 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]

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 2018-07-30
      • 2013-08-07
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 2011-10-06
      • 2021-01-08
      相关资源
      最近更新 更多