-4

如果我有这样的数组,我该如何循环并将计数推入一个新数组?
欢迎所有帮助!

    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

4 回答 4

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/

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

于 2013-08-19T19:30:42.403 回答
1

你可以这样做:

var prod_array = []
for(p in Products) {
    prod_array[p] = (prod_array[p] ? 1 : prod_array[p] +1)
}
于 2013-08-19T19:33:34.973 回答
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

于 2013-08-19T19:39:11.143 回答
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);
于 2013-08-19T19:42:21.370 回答