Mestika
2/17/2016 - 1:39 PM

Grouping elements in array by multiple properties

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"
      }
   ]
]
*/