【问题标题】:Return sum of even numbers in an array返回数组中偶数的总和
【发布时间】:2019-05-11 00:04:08
【问题描述】:

我正在寻找的解决方案:我的函数需要返回数组中所有偶数的总和。预期答案是 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));

我将函数更改为 push 到 sum 数组并返回 sum 数组以查找返回 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 对我没有帮助。

【问题讨论】:

  • 你的意思是对偶数求和还是用偶数index求和?

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


【解决方案1】:

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

【讨论】:

    【解决方案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));

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

    【讨论】:

    • 很明显,OP 是初学者,并被分配了家庭作业。对于您的答案如何最“漂亮”(编码明智),我认为它在这种特定情况下不是最有用的;它可能看起来太抽象了。一个更简单的解释和类似于 OP 看待问题的方式的解决方案可能会更有帮助。
    • 对我来说这是最好的答案,最优雅和现代。上面的答案是用代码解释的,实际上,这个答案没有关于过滤和减少的解释。然而,观察原生原型的实际运行也是一种很好的培训。
    • 这对于查看获得相同答案的多种方法仍然非常有用。方法很棒,但仍然很重要的是要了解这些方法在幕后所做的事情以全面了解。感谢分享。
    【解决方案3】:

    使用过滤器和减少。

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

    【讨论】:

      【解决方案4】:

      你可以使用 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)

      【讨论】:

        【解决方案5】:

        这里已经列出了许多好的解决方案。但是,我想使用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;
        }
        

        还注意到许多涉及 filter 和 reduce 的解决方案未能为 reduce 提供 默认值。如果您传入一个空数组,这将导致错误。这样处理可能会更好:

        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 方面提供最佳性能。这里我们使用公式而不是任何类型的循环。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-11
          • 2014-04-12
          • 2016-01-13
          • 2020-07-14
          • 2021-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多