2017-09-13 186 views
-4

我想将此代码转换为使用reduce而不是for循环。使用reduce而不是for循环

var a = [1, 2, 30, 4, 5, 6]; 
 
var add = 0; 
 
var r = []; 
 

 
for (var i = 0; i < a.length; i++) { 
 
\t add = 0; 
 
\t for (var j = 0; j < i; j++) { 
 
    \t add += a[j]; 
 
    } 
 
    if (a[i] > add) { 
 
    \t r.push(a[i]); 
 
    } 
 
} 
 
console.log(r); // => [ 1, 2, 30 ]

如何,我们可以使用减少得到相同的放出来?

+2

没有你尽量减少相关的东西吗? – ochi

+0

输出中的逻辑是什么[1,2,30] – Ved

+0

'a.splice(0,a.length/2)' – baao

回答

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]

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 ]

相关问题