Group Javascript Items By One Property
My question is related to this question. You will have to first read it. var ids = '1*2*3'; var Name ='John*Brain*Andy'; var Code ='A12*B22*B22'; Now that I have an array of javas
Solution 1:
It is a little hard to tell the exact resulting structure that you want.
This code:
// Split values into arrays
Code = Code.split('*');
Name = Name.split('*');
ids = ids.split('*');
// cache the length of one and create the result objectvarlength= Code.length;
varresult= {};
// Iterate over each array item// If we come across a new code, // add it to result with an empty arrayfor(vari=0; i < length; i++) {
if(Code[i] inresult== false) {
result[ Code[i] ] = [];
}
// Push a new object into the Code at "i" with the Name and ID at "i"
result[ Code[i] ].push({ name:Name[i], id:ids[i] });
}
Will produce this structure:
// Resulting object
{
// A12 has array with one object
A12: [ {id: "1", name: "John"} ],
// B22 has array with two objects
B22: [ {id: "2", name: "Brain"},
{id: "3", name: "Andy"}
]
}
Solution 2:
- Split the strings on "*" so that you have 3 arrays.
- Build objects from like-indexed elements of each array.
- While building those objects, collect a second object that contains arrays for each "Code" value.
Code:
functiontoGroups(ids, names, codes) {
ids = ids.split('*');
names = names.split('*');
codes = codes.split('*');
if (ids.length !== names.length || ids.length !== codes.length)
throw"Invalid strings";
var objects = [], groupMap = {};
for (var i = 0; i < ids.length; ++i) {
var o = { id: ids[i], name: names[i], code: code[i] };
objects.push(o);
if (groupMap[o.code]) {
groupMap[o.code].push(o);
else
groupMap[o.code] = [o];
}
return { objects: objects, groupMap: groupMap };
}
The "two arrays" you say you want will be in the "groupMap" property of the object returned by that function.
Post a Comment for "Group Javascript Items By One Property"