求和JavaScript数组

时间:2016-06-22 08:38:51

标签: javascript arrays type-conversion coercion

在这里开始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);

感谢大家!

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

这意味着,每次拨打mySum += myArray.push(i)时,您都会说mySum += myArray.length(在推送i之后)。

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

mySum += i

而不是

mySum += myArray.push(i)

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

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

答案 2 :(得分:0)

使用" 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

答案 3 :(得分:0)

A"只是数学" (无循环)选项。对于较大的数字而言,这比循环更好。

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

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