Reputation: 2785
Having this array
[ { name: 'foo', gender: 'm' }, { name: 'bar', gender: 'f' }, { name: 'baz', gender: 'f' } ]
How is it (maybe in a one-liner) possible to transform it into:
[ { gender: 'f', names: [ { name: 'bar' }, { name: 'baz' } ] } ]
Filtered by gender Vanilla JS, ES6 and/or ES7.
Upvotes: 0
Views: 604
Reputation: 386560
You could filter by gender
and map objects with name
.
var array = [{ name: 'foo', gender: 'm' }, { name: 'bar', gender: 'f' }, { name: 'baz', gender: 'f' }],
object = { gender: 'f', names: array
.filter(({ gender }) => gender === 'f')
.map(({ name }) => ({ name }))
};
console.log(object);
Upvotes: 2
Reputation: 22524
You can use array#reduce
to group your data based on gender
in an object accumulator. Then get all the values from this object using Object.values()
.
const data = [ { name: 'foo', gender: 'm' }, { name: 'bar', gender: 'f' }, { name: 'baz', gender: 'f' } ],
group = Object.values(data.reduce((r, {name, gender}) => {
r[gender] = r[gender] || {gender, names : []};
r[gender].names.push({name});
return r;
},{}));
console.log(group);
Upvotes: 0