如何按javascript数组中的列分组

时间:2012-03-03 00:50:12

标签: javascript jquery group-by

我需要在javascript中对多维数组的元素进行分组。 这是我的阵列:

        var data = []; 
        data.push(["ASIA", "CHINA", 1992, 31689222674, 5]); 
        data.push(["ASIA", "CHINA", 1997, 31327384072, 5]); 
        data.push(["ASIA", "INDIA", 1992, 27910388563, 5]); 
        data.push(["ASIA", "INDIA", 1993, 28669881069, 5]); 
        data.push(["ASIA", "INDIA", 1997, 29421629324, 5]); 
        data.push(["ASIA", "INDONESIA", 1992, 30990831267, 5]); 
        data.push(["ASIA", "INDONESIA", 1997, 31478506122, 5]); 
        data.push(["ASIA", "JAPAN", 1992, 29239959577, 5]); 
        data.push(["ASIA", "JAPAN", 1996, 29901316952, 5]); 
        data.push(["ASIA", "JAPAN", 1997, 29860665098, 5]); 
        data.push(["ASIA", "VIETNAM", 1992, 27229816811, 5]); 
        data.push(["ASIA", "VIETNAM", 1996, 27553006375, 5]); 
        data.push(["ASIA", "VIETNAM", 1997, 27240345298, 5]); 

        data.push(["AMERICA", "BRAZIL", 1992, 31689222674, 5]); 
        data.push(["AMERICA", "BRAZIL", 1993, 31207214888, 5]); 
        data.push(["AMERICA", "BRAZIL", 1994, 31926517793, 5]); 
        data.push(["AMERICA", "EUA", 1992, 27910388563, 5]); 
        data.push(["AMERICA", "EUA", 1993, 28669881069, 5]); 
        data.push(["AMERICA", "EUA", 1994, 29343326950, 5]); 

我需要通过组合该数组的内容来对元素进行分组。我找到了这段代码,但它考虑了一个数组索引。

function group(data, index) {
    var o;
    var other = {};
    $.each(data, function(i, value) {
        o = data[i][index];         
        if (!(o in other))
            other[o] = [];
        other[o].push(data[i]);
    })
    return other;           
}

然后具有更多索引的组应该作为示例:按索引1 + 2分组。

    ASIA - CHINA => ["ASIA", "CHINA", 1992, 31689222674, 5], 
                    ["ASIA", "CHINA", 1997, 31327384072, 5];
    ASIA - INDIA => ....
    ASIA - INDONESIA => .....
    ASIA - JAPAN => ....
    ASIA - VIETNAM =>

    AMERICA - BRAZIL => ....
    AMERICA - EUA => ....

这也适用于涉及更多指数的小组。

3 个答案:

答案 0 :(得分:10)

如果您需要此类功能,强烈建议使用underscore.js

var groupedData = _.groupBy(data, function(innerArray) {
    return innerArray[0] + "-" + innerArray[1];
});

您还可以自定义功能

function groupByTwoIndexes(data, index1, index2) {
    var o;
    var other = {};
    $.each(data, function(i, value) {
        o = data[i][index1] + "-" + data[i][index2];         
        if (!(o in other))
            other[o] = [];
        other[o].push(data[i]);
    })
    return other;           
}

var groupedDataByTwo = groupByTwoIndexes(data, 0, 1);

Demo

答案 1 :(得分:2)

如果您熟悉.NET的Linq,您可能会发现使用LinqJS很有意思 - http://linqjs.codeplex.com/

它声称支持所有Linq的方法,包括GroupBy。

答案 2 :(得分:0)

我刚编辑了上面的代码

function group(data, index1, index2) 
{

var o;

var other = {};

$.each(data, function(i, value  
 {
    o = data[i][index1][index2];         
    if (!(o in other))
        other[o] = [];
    other[o].push(data[i]);
})
return other;           

}

var result = group(data,0,1);

所以现在数组将按照大陆和国家的index1和index2进行分组。我已经过测试,它正在运行。