对 JavaScript 数组的内容求和

Sum the contents of a JavaScript array

JavaScript 初学者...

我正在学习 Adrian Neumann 的 Simple Programming Problems,我的问题是关于基础练习中的第 5 个问题。

Write a program that asks the user for a number n and prints the sum of the numbers 1 to n... such that only multiples of 3 and 5 are considered.

这是我目前的代码...

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

谢谢大家!

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

改为使用mySum += i;

或者如果您以后仍想使用该数组 process/console。记录单独的数字:

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

查看 Array.push 的文档。它说:"Returns the new length property of the object upon which the method was called."

这意味着每次调用 mySum += myArray.push(i) 时,您都在说 mySum += myArray.length(在按下 i 之后)。

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

mySum += i

而不是

mySum += myArray.push(i)

在更好的代码方面,我同意 mplungjan - Array.reduce 在这里使用会很好。

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

考虑以下使用 "negative" 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

一个"just math"(无循环)选项。对于更大的数字,这比循环更好。

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 +']');

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