我正在寻找的解决方案:我的函数需要返回数组中所有偶数之和。预期的答案是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));
我更改了将函数压入求和数组的函数,并返回求和数组以查找返回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并没有帮助我。
答案 0 :(得分:4)
使用
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));
答案 1 :(得分:2)
将filter
与reduce
一起使用:
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));
当前代码的问题是您正在检查索引,而不是元素。
答案 2 :(得分:2)
使用过滤器和缩小。
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);
答案 3 :(得分:1)
您可以使用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)
答案 4 :(得分:0)
这里已经列出了许多好的解决方案。但是,我想到使用 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;
}
还注意到许多涉及过滤和缩减的解决方案未能为缩减提供默认值。如果您传入一个空数组,这将导致错误。可以通过这种方式更好地处理:
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
方面提供最佳性能。这里我们使用的是公式而不是任何类型的循环。