user1027620
user1027620

Reputation: 2785

JavaScript mapping and filtering a basic array of objects

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

Answers (2)

Nina Scholz
Nina Scholz

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

Hassan Imam
Hassan Imam

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

Related Questions