输出结果数组,其中包含给定数组的唯一元素的分组计数

时间:2013-08-19 19:24:34

标签: javascript

如果我有这样的数组,我怎么能循环并将计数推入一个新数组呢? 所有的帮助都会成功!

    var Products = [
    ['Product A'],
    ['Product A'],
    ['Product A'],
    ['Product A'],
    ['Product A'],
    ['Product B'],
    ['Product B'],
    ['Product B'],
    ['Product B'],
    ['Product B'],
    ['Product B'],
    ['Product B'],
    ['Product B'],    
    ['Product B'],
    ['Old Product B'],
    ['Old Product B'],
    ['Old Product B'],
    ['Old Product B'],
    ['Old Product B'],
    ['Old Product]
         ];

结束目标:

        var UniqueProducts = [
    ['Product A',5],
    ['Product B',6],
    ['Old Product B',9]
     ];

4 个答案:

答案 0 :(得分:5)

 var obj = {};
 for (var i = 0, l = Products.length; i < l; i++) {
   obj[Products[i][0]] = obj[Products[i][0]] || 0;
   obj[Products[i][0]] += 1;
 }
 console.log(obj);

请参阅此小提琴http://jsfiddle.net/XWSRE/1/

但在问这些问题之前,请谷歌一次。这是非常通用的要求,您可以在大多数地方找到解决方案。

答案 1 :(得分:1)

你可以这样做:

var prod_array = []
for(p in Products) {
    prod_array[p] = (prod_array[p] ? 1 : prod_array[p] +1)
}

答案 2 :(得分:0)

@ Exception的答案已经提供了一种明智的方法,但对于完全输出,我遍历对象属性以转换为数组:

var u = {}, uniqueProducts = [];
Products.forEach(function (v) {
    if (u[v[0]]) {
        u[v[0]] += 1;
    } else {
        u[v[0]] = 1;
    }
});

for (var property in u) {
    if (u.hasOwnProperty(property)) {
        uniqueProducts.push([property, u[property]]);
    }
}

console.log(uniqueProducts);

请参阅jsFiddle

答案 3 :(得分:0)

完成了一些预期结果的简单编码。  http://jsfiddle.net/y9a8L/

function GroupBy(arrParam)
{
    var result = [];
    var lastItem = null;
    var item = null;
    var index = -1;
    for (var i = 0; i < arrParam.length ; i++ )
    {
        item = arrParam[i][0];
        if (lastItem != item)
        {
            result.push([item,1]);
            index++;
        }
        else
        {
            result[index][1]++;
        }
        lastItem = item
    }
    console.log(result)
}
GroupBy(Products);