我得到了对象数组(任务)。每个任务都有名为“类别”和“持续时间”的属性。
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 中做到这一点吗?
最佳答案
您可以只返回一个具有类别:持续时间
的对象。
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)
关于javascript - 按属性(property)的独特值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42423801/