【问题标题】:Sum the contents of a JavaScript array对 JavaScript 数组的内容求和
【发布时间】:2016-10-24 02:00:38
【问题描述】:

在这里开始 JavaScript 学习者...

我正在研究 Adrian Neumann 的 Simple Programming Problems,我的问题是关于初级练习中的第 5 题。

编写一个程序,要求用户输入一个数字 n 并打印数字 1 到 n 的总和...以便只考虑 3 和 5 的倍数。

这是我目前的代码...

var myArray = [];
var mySum = 0;

var userNum = prompt("What is your number? "); {
    for (var i = userNum; i > 0; i--) {
        if (i % 5 === 0 || i % 3 === 0) {
            mySum += myArray.push(i);
        } 
    }
}
console.log(mySum);

这会产生不正确的结果28。当我注释掉mySum 语句并打印17 输入的数组时,我得到了看起来正确的[15, 12, 10, 9, 6, 3]

我想知道为什么mySum 语句没有提供预期结果的提示。我也会对提高代码效率的任何技巧感兴趣。非常感谢!

编辑
对于任何感兴趣的人,这是我选择的最适合我的目的和当前级别的代码:

var mySum = 0;

var userNum = prompt("What is your number? ");
for (var i = userNum; i > 0; i--) {
    if (i % 5 === 0 || i % 3 === 0) {
        mySum += +i; // type coercion with unary operator
    } 
}
console.log(mySum);

谢谢大家!

【问题讨论】:

  • 为什么是数组? mySum += i; 或者如果你想:mySum += i; myArray.push(i);myArray.push(i); 然后减少数组:sum = myArray.reduce(function(a, b) { return a + b; });
  • Array.prototype.push 返回数组的新长度,而不是您提供的值,这就是您的总和不正确的原因。
  • 注意外部{ ... } 不是必需的。
  • array.push 和 array.pop 方法是有区别的。在编写之前知道代码会做什么是件好事。当您使用 Array 时,建议您查看以下链接 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 我认为你不需要数组来解决这个问题

标签: javascript arrays type-conversion coercion


【解决方案1】:

“只是数学”(无循环)选项。对于较大的数字,这比循环更好。

var a = parseInt(prompt('What is your number?'));
var five = Math.floor(a / 5);
var three = Math.floor(a / 3);
// if values like 15 are counted twice, remove 'both'
// otherwise this is required to remove the doubling up.
var both = Math.floor(a / 15);

var result = (multiple(five) * 5)
    result += (multiple(three) * 3);
    // remove these results if "15" is counted only once
    result -= (multiple(both) * 15);

// this is the tricky party.
function multiple(x) {
    return (((x + 1) / 2) * x);
}

console.log('result:['+ result +']');
console.log('a:['+ a +'] 3:['+ three +'], 5:['+ five +'], 15:['+ both +']');

注意:不检查确认输入是否为数字。

【讨论】:

    【解决方案2】:

    考虑使用“负”while 循环的以下优化方法:

    var userNum = prompt("What is your number? "),
        mySum = 0;
    
    while (userNum--) {
        if (userNum && (userNum % 5 === 0 || userNum % 3 === 0)) {
            mySum += userNum;
        }
    }
    console.log(mySum);  // 60
    

    【讨论】:

      【解决方案3】:

      查看Array.push 的文档。它说:“返回调用该方法的对象的新长度属性。”

      这意味着每次你打电话给mySum += myArray.push(i),你都在说mySum += myArray.length(在推送i之后)。

      相反,您应该将i 添加到mySum

      mySum += i
      

      而不是

      mySum += myArray.push(i)
      

      在更好的代码方面,我同意 mplungjan - Array.reduce 将是一个不错的选择。

      编辑:实际上,由于您不是从数组开始,而是从数字开始,在这种情况下,for 循环可能是获得结果的最快和最简洁的方法。

      【讨论】:

        【解决方案4】:

        由于 myArray.push(i) 不返回您推送的数字而是数组的当前长度,因此您的总和不是您所期望的。

        改为使用mySum += i;

        或者,如果您还想继续使用该数组来稍后处理/console.log 单独的数字:

         mySum += i; 
         myArray.push(i);
        

        或者只是myArray.push(i); 然后减少数组:

        sum = myArray.reduce(function(a, b) {
          return a + b;
        });
        

        在这里,我还将您在提示输入数字时得到的字符串转换并删除不必要的包装 { }

        var myArray = [];
        var mySum = 0;
        
        var userNum = prompt("What is your number? "); 
        for (var i = +userNum; i > 0; i--) {
          if (i % 5 === 0 || i % 3 === 0) {
            mySum += i;
            myArray.push(i);
          } 
        }
        console.log(mySum,myArray);

        使用reduce 的替代方法 - 在您的情况下可能有点过分,但为了完整起见,我将其包括在内:

        var myArray = [];
        var mySum = 0;
        
        var userNum = prompt("What is your number? "); 
        for (var i = +userNum; i > 0; i--) {
          if (i % 5 === 0 || i % 3 === 0) {
            myArray.push(i);
          } 
        }
        mySum = myArray.reduce(function(a, b) {
          return a + b;
        });
        
        
        console.log(mySum, myArray);

        【讨论】:

        • 这看起来是一个令人愉快的答案,但比我目前的理解水平高一点。 reduce 方法的固有优势是什么? (如前所述,我是一个完全的初学者)。谢谢。
        • 第一个示例将满足您的需求。 reduce 是一种返回数组操作的优雅方式:documentation - 在你的情况下可能有点矫枉过正,因为你无论如何都要循环。
        猜你喜欢
        • 2020-09-25
        • 2022-11-19
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 2018-06-22
        相关资源
        最近更新 更多