【问题标题】:Sum of an array with a condition具有条件的数组的总和
【发布时间】:2018-07-28 05:13:54
【问题描述】:

我想对数组的元素值求和,它们具有相同的年份。

var newData = [];
var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);

var sum = data.reduce(function (a, b,i) {
    if (b[0][i]==b[0][i+1]) {
         return newData.push(b[0],a + b[1]);
    		 
    }    
 }, 0);
 console.log(newData);
 
 //return to:
 
[
["2013",23],
["2014",0],
["2015",2],
["2016",27],
["2017",5]
]

有可能吗? 谢谢你的帮助

【问题讨论】:

  • 为什么不将结果作为一个对象,其中键是年份和值 - 总和?
  • 是在手机上写的,所以我不确定它是否有效。 let s=data.reduce ((o,e)=>(o[e[0]]=~~o[e[0]]+e[1],o),{}); Object.keys(s).map(e=>[e,s[e]])
  • 是的,你说得对

标签: javascript arrays ecmascript-6 reduce


【解决方案1】:

完成这项工作的一种非常快速的方法是使用 JS 的稀疏数组并挑选出非空槽;

var data    = [['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]],
    interim = data.reduce((r,e) => (r[+e[0]] && (r[+e[0]][1] += e[1]) || (r[+e[0]] = e), r), []),
    result  = Object.keys(interim)
                    .map(k => interim[k]);

console.log(result);
.as-console-wrapper {
height     : 100%;
max-height : 100% !important
}

所以Object.keys(interim) 部分只是以极快的方式过滤掉带有未定义键的插槽。所以没什么好担心的。看看这个;

var a = [],
    b = [];
a[1000000000] = "west";
a[500000000]  = "test";
a[0]          = "best";
console.time("test");
b = Object.keys(a)
          .map(k => a[k]);
console.timeEnd("test");
console.log(b);

【讨论】:

    【解决方案2】:

    您可以像这样创建自己的简单且更易于理解的自定义逻辑

    获取 JSON 对象作为响应。

    var newData = [];
    var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
    
    var res = {};
    data.forEach((item)=>{
      if(Object.keys(res).includes(item[0])){
        res[item[0]] += item[1];
      } else {
        res[item[0]] = item[1];
      }   
    });
     console.log(res);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    获取 JSON 数组作为响应。

    var newData = [];
    var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
    
    var res = [];
    data.forEach((item)=>{
      var found = false;
      for(var i=0; i<res.length; i++){
        if(res[i][0] === item[0]){
           res[i][1] += item[1];
           found = true;
           break;
        }
      }
      if(!found){
        res.push(item);
      }
    });
    console.log(res);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      您可以使用 ES6 Mapreduce 方法按年份求和,并传播语法 ... 以从 Map 中获取数组。

      var data = new Array(['2013', 0], ['2013', 0], ['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
      
      const result = data.reduce((r, [y, v]) => {
        r.set(y, (r.get(y) || 0) + v);
        return r;
      }, new Map)
      
      console.log([...result]);

      【讨论】:

        【解决方案4】:

        如果我了解您的需求,请试试这个

        var sums=data.reduce(function(a,b){
            a[b[0]]=(a[b[0]] || 0)+b[1];
        },{});
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-10
          • 2021-06-08
          • 1970-01-01
          相关资源
          最近更新 更多