patternjavascriptCritical
Grouping elements in array by multiple properties
Viewed 0 times
elementsgroupingarraypropertiesmultiple
Problem
During work, I was given this task: to group elements with similar properties in the array.
In general, the problem is as follows:
If I group this elements by
After some experimentation, I came to the following solution:
```
Array.prototype.groupByProperties = function(properties){
var arr = this;
var groups = [];
for(var i = 0, len = arr.length; i<len; i+=1){
var obj = arr[i];
if(groups.length == 0){
groups.push([obj]);
}
else{
var equalGroup = false;
for(var a = 0, glen = groups.length; a<glen;a+=1){
var group = groups[a];
var equal = true;
var firstElement = group[0];
properties.forEach(function(property){
if(firstElement[property
In general, the problem is as follows:
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"}
];If I group this elements by
lastname and age, I will get this result: var result = [
[
{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"}
]
];After some experimentation, I came to the following solution:
```
Array.prototype.groupByProperties = function(properties){
var arr = this;
var groups = [];
for(var i = 0, len = arr.length; i<len; i+=1){
var obj = arr[i];
if(groups.length == 0){
groups.push([obj]);
}
else{
var equalGroup = false;
for(var a = 0, glen = groups.length; a<glen;a+=1){
var group = groups[a];
var equal = true;
var firstElement = group[0];
properties.forEach(function(property){
if(firstElement[property
Solution
I felt compelled to write that you probably should combine forEach and map with the answer of Alexey Lebedev.
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];
});Code Snippets
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];
});Context
StackExchange Code Review Q#37028, answer score: 65
Revisions (0)
No revisions yet.