如何循环遍历数组并只对一半的项求和?(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]
*/