Grouping elements in array by multiple properties
/* From
** http://codereview.stackexchange.com/questions/37028/grouping-elements-in-array-by-multiple-properties
*/
var list = [
{name: "1", lastname: "foo1", age: "16"},
{name: "2", lastname: "foo", age: "13"},
{name: "3", lastname: "foo1", age: "11"},
{name: "4", lastname: "foo", age: "11"},
{name: "5", lastname: "foo1", age: "16"},
{name: "6", lastname: "foo", age: "16"},
{name: "7", lastname: "foo1", age: "13"},
{name: "8", lastname: "foo1", age: "16"},
{name: "9", lastname: "foo", age: "13"},
{name: "0", lastname: "foo", age: "16"}
];
//Group this elements by lastname and age
var list = [
{name: "1", lastname: "foo1", age: "16"},
{name: "2", lastname: "foo", age: "13"},
{name: "3", lastname: "foo1", age: "11"},
{name: "4", lastname: "foo", age: "11"},
{name: "5", lastname: "foo1", age: "16"},
{name: "6", lastname: "foo", age: "16"},
{name: "7", lastname: "foo1", age: "13"},
{name: "8", lastname: "foo1", age: "16"},
{name: "9", lastname: "foo", age: "13"},
{name: "0", lastname: "foo", age: "16"}
];
function arrayFromObject(obj) {
var arr = [];
for (var i in obj) {
arr.push(obj[i]);
}
return arr;
}
function groupBy( array , f )
{
var groups = {};
array.forEach( function( o )
{
var group = JSON.stringify( f(o) );
groups[group] = groups[group] || [];
groups[group].push( o );
});
return Object.keys(groups).map( function( group )
{
return groups[group];
})
}
var result = groupBy(list, function(item){
return [item.lastname, item.age];
});
console.log(result);
/* RESULT IS: */
/*
[
[
{
"name":"1",
"lastname":"foo1",
"age":"16"
},
{
"name":"5",
"lastname":"foo1",
"age":"16"
},
{
"name":"8",
"lastname":"foo1",
"age":"16"
}
],
[
{
"name":"2",
"lastname":"foo",
"age":"13"
},
{
"name":"9",
"lastname":"foo",
"age":"13"
}
],
[
{
"name":"3",
"lastname":"foo1",
"age":"11"
}
],
[
{
"name":"4",
"lastname":"foo",
"age":"11"
}
],
[
{
"name":"6",
"lastname":"foo",
"age":"16"
},
{
"name":"0",
"lastname":"foo",
"age":"16"
}
],
[
{
"name":"7",
"lastname":"foo1",
"age":"13"
}
]
]
*/