簡體   English   中英

按屬性的唯一值分組

[英]group by unique values of property

我得到了對象(任務)數組。 每個任務都有名為“類別”和“持續時間”的屬性。

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找到uniquecategory,但我仍然必須總結“持續時間”。

  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來實現?

您可以只返回一個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) 

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM