【问题标题】:How can I loop through array and sum only half the items? (javascript)如何遍历数组并仅对一半项目求和? (javascript)
【发布时间】:2015-07-25 01:14:47
【问题描述】:

假设我有一个包含十个项目的数组,我想制作 2 个单独的数组,它们通过奇数和偶数分布对原始数组中的项目求和。 例如:

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() 函数的使用是“我的难题中缺失的部分”:)

【问题讨论】:

  • 顺便说一句,在你的例子中,你的一些总和混合了奇数和偶数项目(例如333+296),可能会让一些人绊倒。
  • 也许我看错了你的问题,你是不是想对每个列表中奇数和偶数交替的项目求和?

标签: javascript arrays


【解决方案1】:

这应该只用一个循环就可以满足您的需求:

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]
*/

如果前一项的总和是现有数组的总和,那么您只需要将前一项添加到当前项。

样式说明:通常认为对变量使用 Pascal Case 是不好的做法,除非它们是类

【讨论】:

    【解决方案2】:

    使用带有 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));
      }
    }
    

    在此处使用按位 OR |0 可确保 sum[-1] 中未定义的值为 0。

    var original = [288,333,313,296,102,299,333,333,316,289];
    var sumA = [], sumB = [];
    
    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));
      }
    }
    
    $("#a").text(JSON.stringify(sumA));
    $("#b").text(JSON.stringify(sumB));
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="a"></div>
    <div id="b"></div>

    【讨论】:

      【解决方案3】:
      var arraySumA = OriginalArray.reduce(function(c, x, i) {
          if(i % 2==1) c += x;
          return c;
      });
      
      var arraySumB = OriginalArray.reduce(function(c, x, i) {
          if(i % 2==0) c += x;
          return c;
      });
      

      或与Array.prototype.reduce 通话:

      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});
      

      【讨论】:

      • 但是这个解决方案不就是两个循环吗?
      • 第二个答案没有给他两个数组
      • 它确实给了他两个数组......它们恰好在一个对象中。
      • var arrayA = sums.even; 等很容易。您甚至可以重构此示例以在外部范围内使用包含两个数组的数组或对象,而不是新对象。说这个答案不好,因为它没有在外部范围内“返回两个数组”,这很像说“那个变量没有按照 OP 想要的方式命名”。 SO 不是牵手,而是解决问题。
      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 2020-11-15
      • 1970-01-01
      • 2019-12-15
      • 2015-02-23
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      相关资源
      最近更新 更多