返回数组中偶数之和

时间:2019-05-11 00:04:08

标签: javascript arrays for-loop if-statement ecmascript-6

我正在寻找的解决方案:我的函数需要返回数组中所有偶数之和。预期的答案是30。

我遇到的问题:它返回的答案是25。

let numStr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const sumEvens = (numStr) => {
  let sum = 0;
  for (let i = 0; i < numStr.length; i++) {
    if (i % 2 === 0){ 
    sum = sum + numStr[i];
    }
  }
  return sum;
}
 
console.log(sumEvens(numStr));

我更改了将函数压入求和数组的函数,并返回求和数组以查找返回25的原因,这是因为它使一个奇数数组而不是偶数数组。

let numStr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const sumEvens = (numStr) => {
  let sum = [ ];
  for (let i = 0; i < numStr.length; i++) {
    if (i % 2 === 0){ 
    sum.push(numStr[i]);
    }
  }
  return sum;
}
 
console.log(sumEvens(numStr));

我能够获得正确的30输出的唯一方法是使我的if语句if (i % 2 !== 0),但是我知道这意味着仅在数组中的数字不是偶数时才添加。

我感觉自己很亲近,但是缺少一件小事。其他SO帖子和MDN并没有帮助我。

5 个答案:

答案 0 :(得分:4)

使用

if (i % 2 === 0){ 

您正在检查被迭代的 index 是否为偶数。因此,您最终将numStr[0]numStr[2]等加在一起。改为检查该索引处的值:

if (numStr[i] % 2 === 0) {

let numStr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const sumEvens = (numStr) => {
  let sum = 0;
  for (let i = 0; i < numStr.length; i++) {
    if (numStr[i] % 2 === 0) {
    sum = sum + numStr[i];
    }
  }
  return sum;
}
 
console.log(sumEvens(numStr));

答案 1 :(得分:2)

filterreduce一起使用:

let numStr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const sumEvens = arr => arr.filter(e => !(e % 2)).reduce((a, b) => a + b);

console.log(sumEvens(numStr));

当前代码的问题是您正在检查索引,而不是元素。

答案 2 :(得分:2)

使用过滤器和缩小。

let numStr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

let sum = numStr.filter(i => i%2 ===0).reduce((a,v) => a += v);

console.log(sum);

答案 3 :(得分:1)

您可以使用JavaScript reduce

let numStr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

function getSum(total, num) {
  return total + (num%2===0?num:0);
}
var my_sum = numStr.reduce(getSum, 0);

console.log(my_sum)

答案 4 :(得分:0)

这里已经列出了许多好的解决方案。但是,我想到使用 for...of 循环分享以下内容:

const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const sumEvens = (nums) => {
  var total = 0;
  for (let i of nums) { 
    if (i%2 ===0) total += i; 
  }
  return total;
}

还注意到许多涉及过滤和缩减的解决方案未能为缩减提供默认值。如果您传入一个空数组,这将导致错误。可以通过这种方式更好地处理:

const sum = nums.filter(a => a%2 === 0).reduce((a, b) => a+b, 0);

在完全不同的情况下,如果您知道您总是需要对一系列偶数执行此求和。数字。我们也可以这样做:

const sumEvensInRange = (from , to) => {
  if (from % 2 !== 0 || to % 2 !== 0) {
    console.log(`even numbers expected: [${from}, ${to}]`);
    return -1;
  }
  if (from > to || from === to) {
    console.log(`invalid input: {to} should be greater than ${from}`);
    return -1;
  }
  return (from + to) * (1 + (to - from)/2) / 2;
}

console.log(sumEvensInRange(10, 20)); // 90

在这种情况下,以上将在 Big O notation 方面提供最佳性能。这里我们使用的是公式而不是任何类型的循环。