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

时间:2018-08-29 10:19:46

标签: javascript arrays

我能够使用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?editors=0011

9 个答案:

答案 0 :(得分:1)

您可以先slice个数组,然后reduce个结果数组。不需要reduceRight,因为求和运算是可交换的。

x = [1, 2, 3, 4, 5];

n = 4;

y = x.slice(-n).reduce((acc, val) => acc + val);

console.log(y);

答案 1 :(得分:1)

您可以在计数c上使用闭包,并检查此值并减小并以Microsoft Docs.取值。

此提案根据需要使用logical AND &&

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

console.log(sum);

答案 2 :(得分:1)

reduceRight(或归约)中,有2个参数

  1. 回调
  2. 初始值(可选,在这种情况下,last/first将是初始值,并且将从second-last/second开始,对于reduceRight/reduce而言)

现在回调具有4个参数,

  1. 累加器(我们上次返回(每个),首次返回init或首次返回的last / first值)
  2. 每个条目(从倒数第二秒到第二秒,取决于是否传递了初始值)
  3. 当前索引
  4. 整个收藏集(当您处于连续链中时,这最有用)

您所要做的就是(假设您必须添加最后一个N号)

IF (Collection length - Current index) <= N 然后 将当前值与总和相加并返回

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,并且不会传给and运算符,否则将返回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);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  

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))

答案 5 :(得分:0)

 board_href_deals                     items     test1
0            test2  [{'x': 'a'}, {'x': 'b'}]    ['test1', 'test2']

答案 6 :(得分:0)

非常简单:

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);

答案 7 :(得分:-1)

您可以尝试以下逻辑:

  • 在循环应结束的位置创建最终索引(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))

答案 8 :(得分:-1)

类似这样的东西

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