对 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 +']');
注意:不检查以确认输入是否为数字。
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 +']');
注意:不检查以确认输入是否为数字。