Reputation: 109
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.
Upvotes: 3
Views: 787
Reputation: 24617
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; }
Upvotes: 0
Reputation: 109
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.
Upvotes: 0
Reputation: 7452
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");
Upvotes: 1