0

我有一个数组,在这个数组中会保存一个 JavaScript 对象。

var items = [];

var item = {
   id: data.id,
   kategorie: data.kategorie,
   name: data.name
}

items.push(item);        // that will be done few times

现在我有这样的物品

items[0] = id: 1, kategorie: "scheduled", name: "Test1"
items[1] = id: 2, kategorie: "queued", name: "Test2"
items[2] = id: 3, kategorie: "recorded", name: "Test3"
items[3] = id: 4, kategorie: "recorded", name: "Test4" 
items[4] = id: 5, kategorie: "recorded", name: "Test5"

我想数这个数组。至少最终的数组应该是这样的。

arrayFinal[0] = kategorie: "scheduled", counted: 1
arrayFinal[1] = kategorie: "recorded", counted: 3

我该怎么做?

4

5 回答 5

2

这不会产生你的确切输出,但它让你知道该怎么做:

var items = [],
    arrayFinal = [];

items[0] = {
    id: 1,
    kategorie: "scheduled",
    name: "Test1"
};
items[1] = {
    id: 2,
    kategorie: "queued",
    name: "Test2"
};
items[2] = {
    id: 3,
    kategorie: "recorded",
    name: "Test3"
};
items[3] = {
    id: 4,
    kategorie: "recorded",
    name: "Test4"
};
items[4] = {
    id: 5,
    kategorie: "recorded",
    name: "Test5"
};

items.forEach(function (v, i) {
    if (typeof arrayFinal[v.kategorie] === 'undefined') {
        arrayFinal[v.kategorie] = 1;
    } else {
        arrayFinal[v.kategorie] += 1;
    }
});
于 2013-07-04T13:44:29.480 回答
1
var items = [
    { id: 1, kategorie: "scheduled", name: "Test1" },
    { id: 2, kategorie: "queued", name: "Test2" },
    { id: 3, kategorie: "recorded", name: "Test3" },
    { id: 4, kategorie: "recorded", name: "Test4" },
    { id: 5, kategorie: "recorded", name: "Test5" }
];

var index, 
    arrayFinal = [];
arrayFinal.contains = function(kategorie) {
    for(var i = 0, len = arrayFinal.length; i < len; i++) {
        if(arrayFinal[i].kategorie === kategorie) {
            return i;
        }
    }
    return false;
};

for(var i = 0, len = items.length; i < len; i++) {
    if( index = arrayFinal.contains(items[i].kategorie)) {
        arrayFinal[index].counted++;
    } else {
       arrayFinal.push({ kategorie: items[i].kategorie, counted: 1 });
    }
}
于 2013-07-04T13:50:27.720 回答
1

查看 underscore.js 的_.countBy例程:

counts = _.countBy(items, "kategorie");

这将创建一个如下所示的对象:

{ 
    recorded : 3,
    ...
}

要将其转换为数组格式,您需要_.map

arrayFinal = _.map(counts, function(v,k){
    return {kategorie: k, counted: v};
});

好了,你完成了。

于 2013-07-04T19:06:49.697 回答
1

如果您熟悉 linq,则可以编写查询。按类别分组,计算 ID。

用于 JavaScript 的 LINQ

例如。:

 var queryResult = Enumerable.From(items)    
.GroupBy("$.kategorie", "", 'key,e=>key+":"+e.Count()', "").ToJSON();
于 2013-07-04T13:43:22.343 回答
0

如果您考虑一下并进行实验,那么您会做到的。

  1. 创建一个关联数组kategorieCount
  2. 迭代items。如果有kategorieCount[items[i].name]增加它,如果没有 - 创建元素i然后增加值。
  3. 创建一个数组arrayFinal
  4. 迭代kategorieCount。将键放入arrayFinal[i].kategorie,将值放入arrayFinal[i].counted
于 2013-07-04T13:46:53.487 回答