如何循环遍历数组并只对一半的项求和?(javascript)
假设我有一个由十个项目组成的数组,我想制作两个单独的数组,通过奇偶分布对原始数组中的项目求和。 例如:如何循环遍历数组并只对一半的项求和?(javascript),javascript,arrays,Javascript,Arrays,假设我有一个由十个项目组成的数组,我想制作两个单独的数组,通过奇偶分布对原始数组中的项目求和。 例如: OriginalArray [288,333,313,296,102,299,333,333,316,289] arraySumA [288,288+313,288+313+102,288+313+102+333,288+313+102+333+316] arraySumB [333,333+296,333+296+299,333+296+299+333,...] 我如何使用不超过一个循环(
OriginalArray [288,333,313,296,102,299,333,333,316,289]
arraySumA [288,288+313,288+313+102,288+313+102+333,288+313+102+333+316]
arraySumB [333,333+296,333+296+299,333+296+299+333,...]
我如何使用不超过一个循环(如果可能)来实现这一点
更新:感谢大家的建议,我最终没有使用它们,但它们确实帮助我设计了自己的解决方案。
特别感谢您@Dana Woodman,您使用的push()函数是“我的拼图中缺少的一块”:
或者使用一个数组。原型。减少调用:
var sums = OriginalArray.reduce(function(c, x, i) {
if(i % 2==0) c.even += x;
else c.odd += x;
return c;
}, {even: 0, odd: 0});
对偶数或奇数索引使用带有mod检查的for循环。将相关数组的和推入相关数组的下一个值
for(var i = 0; i < original.length; i++){
if( i % 2 == 0 ){
sumA.push(original[i]+(sumA[sumA.length-1]|0));
}else{
sumB.push(original[i]+(sumB[sumB.length-1]|0));
}
}
这只需一个循环即可满足您的要求:
var OriginalArray = [288,333,313,296,102,299,333,333,316,289];
var arraySumA = [];
var arraySumB = [];
// You use any type of iterator here, like a standard for-loop as well.
OriginalArray.forEach(function (num) {
if (num % 2 === 0) {
// Sum of even items
var prev = arraySumA[arraySumA.length - 1] | 0;
arraySumA.push(prev + num);
} else {
// Sum of odd items
var prev = arraySumB[arraySumB.length - 1] | 0;
arraySumB.push(prev + num);
}
});
/*
Results in:
arraySumA = [288, 584, 686, 1002]
arraySumB = [333, 646, 945, 1278, 1611, 1900]
*/
如果上一个数组的和是现有数组的和,则只需将上一个项添加到当前数组中即可
风格提示:除非变量是类,否则使用变量通常被认为是不好的做法,但这个解决方案不是正好有两个循环吗?第二个答案没有给他两个数组,而是给了他两个数组……它们正好在一个对象中。说var arrayA=sums.even代码>等。您甚至可以重新考虑此示例,以使用外部范围中包含两个数组的数组或对象,而不是新对象。说这个答案不好,因为它没有在外部作用域中“返回两个数组”,这很像说“这个变量的命名方式不是OP想要的”。所以,不是牵手,而是解决问题。顺便说一句,在你的例子中,你的一些总和混合了奇数和偶数项(例如,333+296
),可能会让一些人绊倒。也许我看错了你的问题,你是不是在尝试对每个列表中的奇数和偶数项交替求和?
var OriginalArray = [288,333,313,296,102,299,333,333,316,289];
var arraySumA = [];
var arraySumB = [];
// You use any type of iterator here, like a standard for-loop as well.
OriginalArray.forEach(function (num) {
if (num % 2 === 0) {
// Sum of even items
var prev = arraySumA[arraySumA.length - 1] | 0;
arraySumA.push(prev + num);
} else {
// Sum of odd items
var prev = arraySumB[arraySumB.length - 1] | 0;
arraySumB.push(prev + num);
}
});
/*
Results in:
arraySumA = [288, 584, 686, 1002]
arraySumB = [333, 646, 945, 1278, 1611, 1900]
*/