2

Example data:

var people = [
  { name: 'John', age: 30, gender: 'male' },
  { name: 'Kelly', age: 31, gender: 'female' },
  { name: 'Stephanie', age: 30, gender: 'female' },
  { name: 'Dan',  age: 28, gender: 'male' },
  { name: 'Crystal', age: 29, gender: 'female' }
];

I'm trying to group together an array of objects based on a property of the objects. I attempted using _.groupBy, but that returns an object and not an array. Is there a similar function that can transform into the below result?

Desired result

var newPeople = [
  [
    { name: 'John', age: 30, gender: 'male' },
    { name: 'Dan',  age: 28, gender: 'male' }
  ],
  [
    { name: 'Kelly', age: 31, gender: 'female' },
    { name: 'Stephanie', age: 30, gender: 'female' },
    { name: 'Crystal', age: 29, gender: 'female' }
  ]
];
0

5 Answers 5

3

You can use groupBy and then values and get array of arrays.

var people = [
  { name: 'John', age: 30, gender: 'male' },
  { name: 'Kelly', age: 31, gender: 'female' },
  { name: 'Stephanie', age: 30, gender: 'female' },
  { name: 'Dan',  age: 28, gender: 'male' },
  { name: 'Crystal', age: 29, gender: 'female' }
];

var result = _.values(_.groupBy(people, 'gender'))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Sign up to request clarification or add additional context in comments.

1 Comment

If we have multiple array of keys in groupBy then how will we achieve this?
2

Instead of groupBy you could use lodash's partition:

let result = _.partition(people, {gender: 'male'})

or to have them in seperate variables, add a dash of destructuring:

let [males, females] = _.partition(people, {gender: 'male'})

Comments

1

You could use an object for the groups and iterate the array while using the group for pushing.

var people = [{ name: 'John', age: 30, gender: 'male' }, { name: 'Kelly', age: 31, gender: 'female' }, { name: 'Stephanie', age: 30, gender: 'female' }, { name: 'Dan',  age: 28, gender: 'male' }, { name: 'Crystal', age: 29, gender: 'female' }],
    groups = Object.create(null),
    newPeople = [];
    
people.forEach(function (o) {
    if (!groups[o.gender]) {
        groups[o.gender] = [];
        newPeople.push(groups[o.gender]);
    }
    groups[o.gender].push(o);
});

console.log(newPeople);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Comments

1

You can use Set to get unique "gender" properties, .Array.from() and .filter() to create an array of arrays of results of filtered matches

var people = [
  { name: 'John', age: 30, gender: 'male' },
  { name: 'Kelly', age: 31, gender: 'female' },
  { name: 'Stephanie', age: 30, gender: 'female' },
  { name: 'Dan',  age: 28, gender: 'male' },
  { name: 'Crystal', age: 29, gender: 'female' }
];


let res = Array.from(new Set(people.map(({gender}) => gender))
          , g => people.filter(({gender}) => gender === g));

console.log(res);

Comments

1

Why not use a good old for loop ?

var groups = {};
var newPeople = [];
var people = [
  { name: 'John', age: 30, gender: 'male' },
  { name: 'Kelly', age: 31, gender: 'female' },
  { name: 'Stephanie', age: 30, gender: 'female' },
  { name: 'Dan',  age: 28, gender: 'male' },
  { name: 'Crystal', age: 29, gender: 'female' }
];
for (let i = 0; i < people.length; i++) {
  let gender = people[i]["gender"];
  if (!groups[gender]) groups[gender] = [];
  groups[gender].push(people[i]);
}
for (let gender in groups) {
  newPeople.push(groups[gender]);
}
console.log(newPeople);

1 Comment

nice! I agree, it could be, and maybe should be, a for loop. However, my project already included lodash and I figured, why not leverage?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.