3

I have unsorted array with some data and I want to create new array width sorted data:

   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"
                };
            }

unsorted data looks like object array

and I would like to group it like

//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]

and so on... I have tried array.map and reduce but they don't seem to work in IE also I have tried:

$.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);

where aggregation_content is

{cell:"ProjectOwner",value:""},{cell:"ProjectName",value:""},{cell:"ProjectLeader",value:""},{cell:"ProjectType",value:""}

and new data is a gridData from the beginning. this works perfectly for a first aggregation. but the problem is that when I aggregate the array newData I need to use

if(! (n in newData[o]))
    newData[o][n] = [];
 newData[o][n].push(objA);

and that [o] should be a parent of [n] -node. ok- second group is ok too with that code, but when I want to make 5 inner groups I need to do it like

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

How can this be made programmatically? If I do

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

I hope I wrote understandable text :D

____Edited_2012_12_13______________________________________

So the input data is

[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
    ....

And the output data should be something like

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
            ...
            ...

The tree view should be two or more nested nodes.

2
  • Can you please just post boiled down what you tried and what you are trying to do in one fell swoop? (and maybe with a fiddle example of what is going wrong?) Commented Dec 12, 2012 at 17:15
  • ill post raw data tomorrow, cause am out of my working place for now. thank you for a fast reaction. Commented Dec 12, 2012 at 22:25

3 Answers 3

1

I have suffered similar situation earlier. I wrote a library to do this:

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

Please check it. I am not promoting my library but I think it fits your requirement.

Also, for older browser support IE < 9. You will also need to include another excellent library:

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

Here is how you get your first set of arrays:

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

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for a response. ill dig into it tomorrow, all data is on working pc. ill let u know if i found something.
0

I came up with this resoult:

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;           
    }

what i do is i make new treeview (multidimencional) array filled with pointers. so the output is grouped by aggregation_content.

Comments

0

Use a loop counter to group into sets based on length:

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; }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.