繁体   English   中英

如何使用Arr.reduceRight计算数组的最后n个元素的总和

[英]How to calculate sum of last n elements of an array using Arr.reduceRight

我能够使用for循环计算数组的最后n个元素的总和,如下所示。 如何使用Arr.reduceRight实现相同的目标?

x = [1,2,3,4,5];
y = 0
for(let i=x.length; i>x.length-3; i--) {
  console.log(x[i-1]);
  y +=x[i-1];

}
console.log(y);

这是codepen链接: https ://codepen.io/anon/pen/rrNxZB edit = 0011

您可以先slice数组,然后reduce生成的数组。 不需要reduceRight因为sum操作是可交换的。

 x = [1, 2, 3, 4, 5]; n = 4; y = x.slice(-n).reduce((acc, val) => acc + val); console.log(y); 

您可以在计数c使用闭包并检查此值并递减,并使用逻辑AND &&获取该值。

此提议使用Array#reduceRight ,如所需。

 var array = [1, 2, 3, 4, 5], sum = array.reduceRight((c => (s, v) => s + (c && c-- && v))(3), 0) console.log(sum); 

reduceRight (或reduce)中,有2个参数

  1. 回调
  2. 初始值(可选,在这种情况下, last/first将是init值,它将从second-last/second开始,相应地为reduceRight/reduce

现在回调有4个参数,

  1. 累加器(我们上次返回的(每个),第一次返回的init或last / first值)
  2. 每个条目(从第二个/秒开始,取决于是否传递了init值)
  3. 目前的指数
  4. 整个集合(当你处于一个连续的链中时,这非常有用)

你所要做的就是,(假设你必须添加最后N号码)

IF (Collection length - Current index) <= N 然后 使用sum和return添加当前值

ELSE 返回当前总和忽略当前值

你可以这样做,

array.reduceRight((sum, each, idx, a) => (a.length - idx) > N ? sum : sum + each , 0)

现在,您可以有条件地删除三元组并执行 sum + 0Each Number

sum + ((array.length - idx) <= N && each)

如果条件(array.length - idx) <= N为false,它将返回false并且它不会返回到运算符,否则它将返回each值,因此它将有条件地添加false (0)或each value

array.reduceRight((sum, each, idx, a) => sum + ((a.length - idx) <= N && each), 0)

 let arr = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], N = 4, sum = arr.reduceRight((s, e, i, a) => s + ((a.length - i) <= N && e), 0); console.log(`Sum of last ${N} values: :`, sum); 

 x = [1,2,3,4,5]; n = 3; // How many numbers to take console.log(x.slice(-n).reduceRight((prev, curr) => prev + curr, 0)) 

reduceRight有两个参数:回调和初始值。 我们正在计算时将它初始化为0。

我的例子中的curr将是3,然后是4然后5. prev将是0,然后是3,然后是7。

请参阅: Array.ReduceRight

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight

几乎就是这样的一个很好的例子。

 const elementCountToLeaveOut = 3; console.log([1,2,3,4,5].reduceRight((acc, val, idx) => idx >= elementCountToLeaveOut ? acc + val : acc)) 

 var n = 4; var x = [1, 2, 3, 4, 5]; var y = x.reduceRight(function(accumulator, currentValue) { if (n > 0) { // If n = 0, stop calculating the sum. accumulator += currentValue; } n--; // Reducing n value for every loop. return accumulator; }, 0); console.log(y); 

很简单:

 var x = [1,2,3,4,5]; var n = 2; var y = x.reduceRight((accumulator, currentValue, index) =>{ if(index < x.length-n) return accumulator; return accumulator + currentValue; }, 0); console.log(y); 

你可以试试这个逻辑:

  • 创建一个最终索引的变量( fIndex ),循环应该结束。
  • 然后你可以使用reduceRight循环并检查传递的索引是否小于fIndex
    • 如果是,则返回上次计算的值
    • 如果不是,则返回总和值。

 function sumRight(arr, n) { var fIndex = arr.length - n; return arr.reduceRight(function(sum, num, index) { return index < fIndex ? sum : sum + num }, 0) } var x = [1,2,3,4,5] console.log(sumRight(x, 3)) 

像这样的东西

lastN=(x,n)=>(m=x.length-n,x.reduceRight((a,v,i)=>{return a+=i>=m?v:0;},0))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM