Lodash Group массив объектов и возвращаемый массив ключей вместо объектов - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть массив таких объектов

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

Использование _.groupBy(data,"age") вернет name в качестве ключа с массивом объекта.

Как вернуть только массив name?

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

после группировки нужно перебрать каждую группу и вернуть только имя:

const res = _.chain(data)
    .groupBy('age')
    .mapValues(group => _.map(group, 'name'))
    // or with FP .mapValues(_.partial(_.map, _, 'name'))
    .value();
0 голосов
/ 06 февраля 2019

ОБНОВЛЕНИЕ

Спасибо за помощь, мне нужен ключ для возраста и значение для массива только имен вместо объекта, я отредактировал свой вопрос

В этом случае вы можете использовать уменьшить

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)
Просто вы можете использовать карту

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)

Когда @ori запрашивает уникальные имена, вы можете использовать Установить , если вы хотите только одно уникальное

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)
0 голосов
/ 06 февраля 2019

Использовать массив # уменьшить

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);
0 голосов
/ 06 февраля 2019

Используйте _.flow(), чтобы создать функцию, которая группирует по age, затем сопоставьте группы с _.mapValues() и используйте _.map()вырвать имена из массивов:

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>

И более краткий lodash / fp версия:

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>
...