【问题标题】:group by unique values of property按属性的唯一值分组
【发布时间】:2017-02-24 02:55:42
【问题描述】:

我得到了一组对象(任务)。每个任务都有名为“类别”和“持续时间”的属性。

var tasks = [
{
 _id : "123",
 category : "someCategory",
 duration: "3432"
},
{
 _id : "113",
 category : "someCategory",
 duration: "23"
},
{
 _id : "124",
 category : "someCategory 2",
 duration: "1343"
},

{
 _id : "2124",
 category : "someCategory 2",
 duration: "1343"
},

{
 _id : "7124",
 category : "someCategory 5",
 duration: "53"
},

{
 _id : "34",
 category : "someCategory",
 duration: "753"
}
]

我想按类别(唯一)和每个类别的总持续时间对任务进行分组。

结果应该是这样的:

 var categories = ["someCategory", "someCategory 2" ... ]
    var duration = [ <summary duration of "someCategory">, <summary duration of "someCategory 2">, ... ]

我有 groupBy 功能,它给了我所有的类别。我可以使用 Array.prototype.filter 找到 uniqueCategories,但我仍然必须对“持续时间”求和。

  var categoryMap = groupBy(tasks, 'category');
      var uniqueCategories = categoryMap.get('category').filter((x, i, a) => a.indexOf(x) == i);

    function groupBy(list, property) {
            var map = new Map();
            list.forEach(function(item) {
                const key = property;
                if(!map.has(key)) {
                  map.set(key, [item[key]])
                } else {
                  map.get(key).push(item[key])
                }
            })
            return map;
          }

然后我创建 { key : value } 数组并按键求和,即

[
    {
     someCategory : 3432
    },
   {
     someCategory : 23
    }
.
.
.
]

我终于实现了我的目标,但代码看起来很乱,根本不可读...... 有没有更好的方法在 Javascript 中做到这一点?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    你可以只用category: duration返回一个对象。

    var tasks = [{"_id":"123","category":"someCategory","duration":"3432"},{"_id":"113","category":"someCategory","duration":"23"},{"_id":"124","category":"someCategory 2","duration":"1343"},{"_id":"2124","category":"someCategory 2","duration":"1343"},{"_id":"7124","category":"someCategory 5","duration":"53"},{"_id":"34","category":"someCategory","duration":"753"}]  
    
    var result = tasks.reduce(function(r, e) {
      r[e.category] = (r[e.category] || 0) + +e.duration
      return r;
    }, {})
    
    console.log(result)

    【讨论】:

      【解决方案2】:

      var tasks = [{"_id":"123","category":"someCategory","duration":"3432"},{"_id":"113","category":"someCategory","duration":"23"},{"_id":"124","category":"someCategory 2","duration":"1343"},{"_id":"2124","category":"someCategory 2","duration":"1343"},{"_id":"7124","category":"someCategory 5","duration":"53"},{"_id":"34","category":"someCategory","duration":"753"}]  
      
      var arr = [];
      tasks.forEach(v => arr.push(v.category));
      var newArr = [...new Set(arr)];
      var arr2 = [];
      
      newArr.forEach(function(v) {
        var obj = {};
        obj.category = v;
        obj.duration = 0;
        arr2.push(obj);
      });
      
      arr2.forEach(v => tasks.forEach(c => c.category == v.category ? v.duration += parseInt(c.duration) : v));
      console.log(arr2);

      【讨论】:

        猜你喜欢
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        相关资源
        最近更新 更多