【问题标题】:Sum values from an array of key-value pairs in JavaScript从 JavaScript 中的键值对数组中求和值
【发布时间】:2013-04-10 01:48:55
【问题描述】:

我已经定义了一个名为 myData 的 JavaScript 变量,它是一个 new Array,如下所示:

var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0],
             ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], 
             ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], 
             ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]);

我想知道是否可以对数组中找到的数值求和(例如 0+0+21+2+0 等),并且可能有一个变量,结果我可以在script 标签,因为我有 7 个此类数组对应于一周中的每一天。我想在此基础上做一个比较。如果可能的话,那是这种行动的最首选方法吗?

【问题讨论】:

  • 遍历数组并添加内部数组的第二个元素。

标签: javascript arrays for-loop sum


【解决方案1】:

使用这个code的新方法

  <script>
var array = [1, 2, 3, 4, 5];

// Getting sum of numbers
var sum = array.reduce(function(a, b){
    return a + b;
}, 0);

console.log(sum);

【讨论】:

    【解决方案2】:

    其中0是初始值

    Array.reduce((currentValue, value) => currentValue +value,0)
    

    Array.reduce((currentValue, value) =>{ return currentValue +value},0)
    

    [1,3,4].reduce(function(currentValue, value) { return currentValue + value},0)
    

    【讨论】:

      【解决方案3】:

      您可以使用Array.reduce 方法:

      const myData = [
        ['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0],
        ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], 
        ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], 
        ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]
      ];
      const sum = myData
        .map( v => v[1] )                                
        .reduce( (sum, current) => sum + current, 0 );
        
      console.log(sum);

      MDN

      【讨论】:

      • 我猜应该是prev[1]。无论如何,结果不会给23
      • @Kooilnc 请注意,Array.reduce 是 ECMAscript 5 的补充,因此并非所有浏览器都支持我 - 请参阅此处 developer.mozilla.org/en-US/docs/JavaScript/Reference/…,其中还包含一些可以实施以克服此问题的代码跨度>
      • @VisioN:忘记了初始值,添加了它。不,它不应该是 prev[1] @MarkWalters:是的,但是可以使用 MDN 链接中的垫片(见答案)
      • 带有 ES6 箭头函数:var sum = myData.reduce((sum, current) =&gt; (sum + current[1]), 0);
      【解决方案4】:

      旧方法(如果你现在不知道参数/参数的长度)

       >> function sumla1(){
      
          result=0
          for(let i=0; i<arguments.length;i++){
      
              result+=arguments[i];
      
          }
          return result;
          }
          >> sumla1(45,67,88);
          >> 200
      

      ES6(数组解构)

      >> function sumla2(...x){return x.reduce((a,b)=>a+b)}
      >>
      >> sumla2(5,5,6,7,8)
      >>
      >> 31
      >>
      >> var numbers = [4, 9, 16, 25];
      >> sumla2(...numbers);
      >> 54
      

      【讨论】:

        【解决方案5】:

        或者在 ES6 中

        values.reduce((a, b) =&gt; a + b),

        示例:

        [1,2,3].reduce((a, b)=>a+b) // return 6
        

        【讨论】:

          【解决方案6】:

          您可以对数组使用本机 map 方法。 map Method (Array) (JavaScript)

          var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0],
                       ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], 
                       ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], 
                       ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]);
          var a = 0;
          myData.map( function(aa){ a += aa[1];  return a; });
          

          a 是你的结果

          【讨论】:

            【解决方案7】:

            如果你想在求和的同时丢弃数组,你可以这样做(比如,stack 是数组):

            var stack = [1,2,3],
                sum = 0;
            while(stack.length > 0) { sum += stack.pop() };
            

            【讨论】:

              【解决方案8】:

              创建一个 sum 方法会很好用,例如您可以将 sum 函数添加到 Array

              Array.prototype.sum = function(selector) {
                  if (typeof selector !== 'function') {
                      selector = function(item) {
                          return item;
                      }
                  }
                  var sum = 0;
                  for (var i = 0; i < this.length; i++) {
                      sum += parseFloat(selector(this[i]));
                  }
                  return sum;
              };
              

              那你就可以了

              > [1,2,3].sum()
              6
              

              在你的情况下

              > myData.sum(function(item) { return item[1]; });
              23
              

              编辑:扩展内置函数可能不受欢迎,因为如果每个人都这样做,我们会意外地相互覆盖(命名空间冲突)。如果您愿意,可以将 sum 函数添加到某个模块并接受一个数组作为参数。 这可能意味着将签名更改为 myModule.sum = function(arr, selector) { 然后 this 将变为 arr

              【讨论】:

                【解决方案9】:

                试试下面的

                var myData = [['2013-01-22', 0], ['2013-01-29', 1], ['2013-02-05', 21]];
                
                var myTotal = 0;  // Variable to hold your total
                
                for(var i = 0, len = myData.length; i < len; i++) {
                    myTotal += myData[i][1];  // Iterate over your first array and then grab the second element add the values up
                }
                
                document.write(myTotal); // 22 in this instance

                【讨论】:

                • 我想你的意思是myData[i][1]。如果值已经是一个数字,为​​什么还要使用parseFloat
                • 它输出 24156 而不是应该的 3。我用“空值数组”进行了测试,我收到了相同的输出...
                • @FelixKling 它适用于myData[i][1],但我如何使 myTotal 在其他脚本标签中可用?
                • Daniel,您修正了 Felix Kling 指出的错字吗?请记住在示例中写“myData[i][1]”而不是错误的版本:“myData[1]”。
                • @FelixKling 感谢编辑,我想我使用 parseFloat 过于谨慎了。丹妮拉我已经测试过了,看看这里 - jsbin.com/ibajas/1
                【解决方案10】:

                我认为最简单的方法可能是:

                values.reduce(function(a, b){return a+b;})
                

                【讨论】:

                • 这应该是对所提出的一般问题的公认答案,但不幸的是,发帖者的数据结构不适用于此问题。这确实是处理数字数组的最佳方式
                • 确保它们是数字不会受到伤害:values.reduce(function(a, b){return +a + +b;})
                • @netpoetica myData.map(function(o) { return o[1]; }).reduce(a, b) { return a + b; })
                • 使用 EC6,这可能看起来像 values.reduce((a + b) =&gt; a + b)
                【解决方案11】:

                数组的javascript内置reduce不是标准的,但是可以使用underscore.js:

                var data = _.range(10);
                var sum = _(data).reduce(function(memo, i) {return memo + i});
                

                变成了

                var sumMyData = _(myData).reduce(function(memo, i) {return memo + i[1]}, 0);
                

                针对您的情况。也看看这个fiddle

                【讨论】:

                  【解决方案12】:

                  我会使用reduce

                  var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0], ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]);
                  
                  var sum = myData.reduce(function(a, b) {
                      return a + b[1];
                  }, 0);
                  
                  $("#result").text(sum);
                  

                  jsfiddle上可用

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-06-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-06-22
                    • 2022-11-18
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多