JavaScript数组:如何分组

3
我有一个未排序的数组,其中包含一些数据,我想创建一个新的数组,其中包含已排序的数据:
   var gridData = [], i = -1;
        while (i++ < 5) {
                gridData[i] = {
                    "ProjectOwner": ["Corporation1","Corporation2","Corporation3"][i % 2],
                    "ProjectId": i,
                    "ProjectName": String.fromCharCode("A".charCodeAt(0) + i % 3) + (1 + i % 3),
                    "ProjectType": ["Conference","Programming","Research","Conference"][i % 4],
                    "ProjectLeader": "Name1Name2Name3".substr(i % 3 * 5,5) + " " + "Surname1Surname2Surname3".substr(i % 3 * 8,8),
                    "StartDate": new Date(2009 + i % 4 % 2, (i + 3) % 12, 5 + i * 4 % 24).toLocaleDateString(),
                    "EndDate": new Date(2010 + i % 4 % 2, (i + 3) % 12, 5 + i * 4 % 24).toLocaleDateString(),
                    "Summary": "bla bla"
                };
            }

未排序的数据看起来像对象数组,我想将其分组。
//First group by ProjectOwner
Object {Corporation1: Array[3], Corporation2: Array[3]}
   //Second group by ProjectName
   Corporation1: Array[x]
            A1 : Array [x]
                 Object1
                 Object2
                 ...
   Corporation2: Array[x]

等等…… 我尝试过使用array.map和reduce,但它们在IE中似乎不起作用, 同时我也尝试过:
$.each(aggregation_content, function(i,aggr) {

    $.each(_newData, function(a, objA) {
        if(i > 0)
            o = _newData[a][aggregation_content[i - 1].cell];
        n = _newData[a][aggregation_content[i].cell];

        if(typeof o == "undefined") //For first row when new Data is empty array
        {
            if(! (n in newData))
                newData[n] = [];
            newData[n].push(objA);
        }
    })})
console.log(newData);

"aggregation_content" 是什么。
{cell:"ProjectOwner",value:""},{cell:"ProjectName",value:""},{cell:"ProjectLeader",value:""},{cell:"ProjectType",value:""}

新数据是从头开始的网格数据。 这对于第一次聚合非常完美。但问题在于,当我聚合新数据数组时,我需要使用...
if(! (n in newData[o]))
    newData[o][n] = [];
 newData[o][n].push(objA);

"并且[o]应该是[n]节点的父节点。好的-第二组也可以使用那个代码,但是当我想要创建5个内部组时,我需要这样做:

"
newData["firstGroup"]["secondGroup"]["thirdGroup"]...[n].push("Some content").

这怎么可以通过编程实现?如果我这样做:

newData = newData[o] - no good
or
temp = newData
do something to temp
newData[o] = temp not good eather :'(

我希望我写的文本能被理解 :D
____编辑于2012年12月13日______________________________________
输入数据如下:
[Object, Object, Object, Object, Object, Object]
  0: Object
   EndDate: "Monday, April 05, 2010"
   ProjectId: 0
   ProjectLeader: "Name1 Surname1"
   ProjectName: "A1"
   ProjectOwner: "Corporation1"
   ProjectType: "Conference"
   StartDate: "Sunday, April 05, 2009"
   Summary: "bla bla"
   __proto__: Object
 1: Object
   EndDate: "Monday, May 09, 2011"
   ProjectId: 1
   ProjectLeader: "Name2 Surname2"
   ProjectName: "B2"
   ProjectOwner: "Corporation2"
   ProjectType: "Programming"
   StartDate: "Sunday, May 09, 2010"
   Summary: "bla bla"
   __proto__: Object
 2: Object
   ...
 3: Object
    ...
 4: Object
    ...
 5: Object
    ....

输出数据应该是类似于这样的:
Object {Corporation1: Array[3], Corporation2: Array[3]}
 Corporation1: Array[2]
   0: A1:  Array[X]
         0: Object
            EndDate: "Monday, May 09, 2011"
            ProjectId: 1
            ProjectLeader: "Name2 Surname2"
            ProjectName: "A1"
            ProjectOwner: "Corporation2"
            ProjectType: "Programming"
            StartDate: "Sunday, May 09, 2010"
            Summary: "bla bla"
         1: Object
            ...
            ...
   1: B2:  Array[X]
         0: Object
            EndDate: "Monday, May 09, 2011"
            ProjectId: 1
            ProjectLeader: "Name2 Surname2"
            ProjectName: "B2"
            ProjectOwner: "Corporation2"
            ProjectType: "Programming"
            StartDate: "Sunday, May 09, 2010"
            Summary: "bla bla"
         1: Object
            ...
            ...
 Corporation2: Array[2]
   0: A1:  Array[X]
         0: Object
            EndDate: "Monday, May 09, 2011"
            ProjectId: 1
            ProjectLeader: "Name2 Surname2"
            ProjectName: "A1"
            ProjectOwner: "Corporation2"
            ProjectType: "Programming"
            StartDate: "Sunday, May 09, 2010"
            Summary: "bla bla"
         1: Object
            ...
            ...
   1: B2:  Array[X]
         0: Object
            EndDate: "Monday, May 09, 2011"
            ProjectId: 1
            ProjectLeader: "Name2 Surname2"
            ProjectName: "B2"
            ProjectOwner: "Corporation2"
            ProjectType: "Programming"
            StartDate: "Sunday, May 09, 2010"
            Summary: "bla bla"
         1: Object
            ...
            ...

树状视图应该是两个或更多的嵌套节点。

你能否简单地概括一下你尝试过什么以及你想要做什么?最好附上一个示例,说明出了什么问题。 - Naftali
我现在不在工作地点,明天我会发布原始数据。感谢您的快速反应。 - Painkiller
3个回答

1

我之前也遇到过类似的情况。我写了一个库来解决这个问题:

https://github.com/raghavv/array-mod

请检查一下。我并不是在推销我的库,但我认为它符合您的要求。
另外,对于旧版浏览器支持IE < 9。您还需要包含另一个优秀的库:

https://github.com/kriskowal/es5-shim/

以下是如何获取您的第一组数组:

a$(gridData).findAll("Corporation1", "ProjectOwner");
a$(gridData).findAll("Corporation2", "ProjectOwner");
a$(gridData).findAll("A1", "ProjectName");
a$(gridData).findAll("B2", "ProjectName");


谢谢您的回复。明天我会仔细研究,所有数据都在工作电脑上。如果我找到了什么,我会告诉您。 - Painkiller

0
我想到了这个结果:
this.groupBy = function(originalData, aggregation_content) 
    {
        var parentNode,node,i,j,g;
        var newData = {},temp;
        this.array.sortedData = originalData;
        $.each(aggregation_content,function(i,objI){
            $.each(originalData.Items,function(j,objJ){
                node = originalData.Items[j].GetValue(aggregation_content[i].column).replace(/\W+/gi,"");
                if(i > 0)
                {
                    temp = newData;
                    $.each(aggregation_content,function(g,objG){
                        parentNode = originalData.Items[j].GetValue(aggregation_content[g].column).replace(/\W+/gi,"");
                        if(!temp[parentNode])
                        {   
                            temp[parentNode] = [];
                        }
                        temp = temp[parentNode];
                    });
                    temp.push(objJ);
                }
                else
                {
                    if(!newData[node])
                        newData[node] = [];
                }
            });
        });
        console.log(newData);
        return newData;           
    }

我所做的是创建一个新的TreeView(多维)数组,其中填充了指针。 因此,输出是按聚合内容分组的。

0
使用循环计数器根据长度分组成集合:
var foo = [57657,57751,58401,58420,58588,58655,59238,59443,59488,59492,59570,59706,59924,59925, 57674, 57687, 57688, 57689, 57693, 57770, 57785, 57786, 57796, 57798, 57810, 57827, 57829, 57835, 57850, 57851, 57852, 57903, 57909, 57910,57957, 57972, 57998, 58022, 58046, 58059, 58064, 58077, 58085, 58097, 58103, 58105, 58127, 58138, 58139, 58220, 58320, 58353, 58356, 58357,58358, 58359, 58360, 58402, 58403, 58404, 58467, 58472, 58473, 58493, 58605]


/* Group into sets of twenty */
var i = 0; while (i <= foo.length) { Math[i] = foo.slice(i, i+20).toString(); i = i + 20; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接