Группа Лодаша по сложному объекту - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть эти данные

 var data = [
        {id:23, family:{familyId:1,name:'AAA',code:'A'},
        {id:24, family:{familyId:1,name:'AAA',code:'A'},
        {id:25, family:{familyId:2,name:'BBB',code:'B'},
        {id:26, family:{familyId:2,name:'BBB',code:'B'}
 ];

И я хочу сгруппировать по всему семейству объектов , но это не работает:

_(data).groupBy(x => x.family).value();

// Returns  {[object Object]: Array(4)}

Конечно, это работает:

_(data).groupBy(x => x.family.code).value();

 // Returns: {A: Array(2), B: Array(2)}

Но тогда мой ключ - это просто значение, а не весь объект

В конце я бы хотел получить это:

 var groupedData = [
        {
            family:{familyId:1,name:'AAA',code:'A'},
            data:[
                {id:23, family:{familyId:1,name:'AAA',code:'A'},
                {id:24, family:{familyId:1,name:'AAA',code:'A'}
            ]
        },
        {
            family:{familyId:2,name:'BBB',code:'B'},
            data:[
                {id:25, family:{familyId:2,name:'BBB',code:'B'},
                {id:26, family:{familyId:2,name:'BBB',code:'B'}
            ]
        },
 ];

1 Ответ

0 голосов
/ 03 ноября 2018

В Лодаш вы можете сделать что-то вроде этого:

var data = [{ id: 23, family: { familyId: 1, name: 'AAA', code: 'A' } }, { id: 24, family: { familyId: 1, name: 'AAA', code: 'A' } }, { id: 25, family: { familyId: 2, name: 'BBB', code: 'B' } }, { id: 26, family: { familyId: 2, name: 'BBB', code: 'B' } } ];

const result = _.chain(data)
  .groupBy('family.familyId')
  .mapValues(x => ({ family: _.head(x).family, data: x }))
  .values()
  .value()

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

Это groupBy для группировки по familyId, за которой следуют values и reduce, чтобы добраться до нужного объекта.

С ES6 вы можете сделать подобное:

var data = [{ id: 23, family: { familyId: 1, name: 'AAA', code: 'A' } }, { id: 24, family: { familyId: 1, name: 'AAA', code: 'A' } }, { id: 25, family: { familyId: 2, name: 'BBB', code: 'B' } }, { id: 26, family: { familyId: 2, name: 'BBB', code: 'B' } } ];

const grp = (d,i) =>
   d.reduce((r,c) => (r[c.family[i]] = [...r[c.family[i]] || [], c], r), {})
const r = Object.values(grp(data,'familyId')).map(x=>({family: x[0], data: x}))

console.log(r)

Та же идея с пользовательским groupBy, настроенным для этого примера и сопровождаемым Object.values, а затем сопоставляющим значения с желаемым выводом.

...