2017-02-23 99 views
0

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

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找到唯一的类别,但仍然需要总结“持续时间”。

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

然后,我创建的数组{键:值}和总和键即

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

最后我实现我的目标,但代码看起来混乱和不可读在所有... 是有更好的方法来做到这一点在Javascript中?

回答

3

您可以用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);