包含其他数组的计数项的数组

时间:2013-07-04 13:37:40

标签: javascript arrays

我有一个数组,在这个数组中将保存一个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

我是怎么做到的?

5 个答案:

答案 0 :(得分: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;
    }
});

答案 1 :(得分:1)

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

LINQ for JavaScript

例如:

 var queryResult = Enumerable.From(items)    
.GroupBy("$.kategorie", "", 'key,e=>key+":"+e.Count()', "").ToJSON();

答案 2 :(得分: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 });
    }
}

答案 3 :(得分:1)

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

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

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

{ 
    recorded : 3,
    ...
}

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

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

在那里,你已经完成了。

答案 4 :(得分:0)

如果你想了一下并进行实验,你就会这样做。

  1. 创建关联数组kategorieCount
  2. 迭代items。如果有kategorieCount[items[i].name]递增,如果没有 - 在i创建元素然后递增值。
  3. 创建数组arrayFinal
  4. 迭代kategorieCount。将密钥放在arrayFinal[i].kategorie中,将值放在arrayFinal[i].counted