0

I have an array of objects like this

const data = [{name:"abc",age:"18"},{name:"dfd",age:"18"},{name:"dnss",age:"20"},{name:"dnnns",age:"12"}]

Using _.groupBy(data,"age") will return name as a key with array of object.

How do I return only array of name?

Ori Drori
  • 183,571
  • 29
  • 224
  • 209
robertrutenge
  • 678
  • 2
  • 9
  • 28

4 Answers4

0

Use _.flow() to create a function that groups by age, then map the groups with _.mapValues(), and use _.map() to pluck the names from the arrays:

const { flow, groupBy, mapValues, map } = _

const fn = flow(
  arr => groupBy(arr, 'age'),
  groups => mapValues(groups, g => map(g, 'name'))  
)

const data = [{name:"abc",age:"18"},{name:"dfd",age:"18"},{name:"dnss",age:"20"},{name:"dnnns",age:"12"}]

const result = fn(data)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

And the terser lodash/fp version:

const { flow, groupBy, mapValues, map } = _

const fn = flow(
  groupBy('age'),
  mapValues(map('name'))
)

const data = [{name:"abc",age:"18"},{name:"dfd",age:"18"},{name:"dnss",age:"20"},{name:"dnnns",age:"12"}]

const result = fn(data)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
Ori Drori
  • 183,571
  • 29
  • 224
  • 209
  • Thanks for help , i need a key to be age and a value to be array of only names instead of object , i have edited my question – robertrutenge Feb 06 '19 at 17:18
0

UPDATE

Thanks for help , i need a key to be age and a value to be array of only names instead of object , i have edited my question

In this case you can use reduce

const data = [{name:"abc",age:"18"},{name:"dfd",age:"18"},{name:"dnss",age:"20"},{name:"dnnns",age:"12"},{name:'abc', age:'23'}]


const op = data.reduce((out,{name,age})=>{
  if(out[age]){
    out[age].push(name)
  } else {
    out[age] = [name]
  }
  return out
},{})

console.log(op)
Simply you can use map

const data = [{name:"abc",age:"18"},{name:"dfd",age:"18"},{name:"dnss",age:"20"},{name:"dnnns",age:"12"}]

const op = data.map(({name}) => name)

console.log(op)

As @ori asking for unique names you can use Set if you want unique one only

const data = [{name:"abc",age:"18"},{name:"dfd",age:"18"},{name:"dnss",age:"20"},{name:"dnnns",age:"12"},{name:'abc', age:'23'}]

const op = [...new Set(data.map(({name}) => name))]

console.log(op)
Code Maniac
  • 37,143
  • 5
  • 39
  • 60
0

Use Array#reduce

const data = [{name:"abc",age:"18"},{name:"dfd",age:"18"},{name:"dnss",age:"20"},{name:"dnnns",age:"12"}]

const res = data.reduce((a,{name,age})=>{
  if(!a[age]) a[age] = [];
  a[age].push(name);
  return a;
}, {});

console.log(res);
kemicofa ghost
  • 16,349
  • 8
  • 82
  • 131
0

after grouping you need to iterate every group and return only name:

const res = _.chain(data)
    .groupBy('age')
    .mapValues(group => _.map(group, 'name'))
    // or with FP .mapValues(_.partial(_.map, _, 'name'))
    .value();
stasovlas
  • 7,136
  • 2
  • 28
  • 29