объединение массивов с использованием lodash - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть этот набор массивов объектов:

let x = [{
    CategoryName: 'abc',
    Items: ['3A']
  },
  {
    CategoryName: 'xyz',
    Items: ['5Z']
  },
  {
    CategoryName: 'abc',
    Items: ['6B']
  },
  {
    CategoryName: 'abc',
    Items: ['9C']
  },
  {
    CategoryName: 'xyz',
    Items: ['1X']
  }
];

что я хочу:

[
    {CategoryName:'abc',Items['3A','6B','9C']},
    {CategoryName:'xyz',Items['1X','5Z']}
]

Как мне добиться этого с помощью lodash?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

С помощью lodash вы можете сделать это также с _.groupBy и mergeWith:

let data = [{ CategoryName: 'abc', Items: ['3A'] }, { CategoryName: 'xyz', Items: ['5Z'] }, { CategoryName: 'abc', Items: ['6B'] }, { CategoryName: 'abc', Items: ['9C'] }, { CategoryName: 'xyz', Items: ['1X'] } ];

const result = _.map(_.groupBy(data, 'CategoryName'), x => 
  _.mergeWith(...x, (o,s) => _.isArray(s) ? o.concat(s) : o))

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

Или с _.transform:

let data = [{ CategoryName: 'abc', Items: ['3A'] }, { CategoryName: 'xyz', Items: ['5Z'] }, { CategoryName: 'abc', Items: ['6B'] }, { CategoryName: 'abc', Items: ['9C'] }, { CategoryName: 'xyz', Items: ['1X'] } ];

const result = _.transform(data, (r, {CategoryName, Items}) => {
  r[CategoryName] = r[CategoryName] || ({CategoryName})
  r[CategoryName].Items = [...Items, ...r[CategoryName].Items || []]
}, {}) 

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

Или просто с помощью ES6 и Array.reduce:

let data = [{ CategoryName: 'abc', Items: ['3A'] }, { CategoryName: 'xyz', Items: ['5Z'] }, { CategoryName: 'abc', Items: ['6B'] }, { CategoryName: 'abc', Items: ['9C'] }, { CategoryName: 'xyz', Items: ['1X'] } ];

const result = data.reduce((r,{CategoryName, Items}) => {
  r[CategoryName] = r[CategoryName] || ({CategoryName})
  r[CategoryName].Items = [...Items, ...r[CategoryName].Items || []]
  return r
}, {}) 

console.log(Object.values(result))
0 голосов
/ 17 декабря 2018

Вы можете group сделать это CategoryName и flatMap, что приведет к Items.Вот и все!

_(x).groupBy('CategoryName').map((v, k)=> ({CategoryName: k, Items: _.flatMap(v, 'Items')})).value()

Рабочая демоверсия:

let x = [{"CategoryName":"abc","Items":["3A"]},{"CategoryName":"xyz","Items":["5Z"]},{"CategoryName":"abc","Items":["6B"]},{"CategoryName":"abc","Items":["9C"]},{"CategoryName":"xyz","Items":["1X"]}],
    res;
    
res = _(x).groupBy('CategoryName').map((v, k)=> ({CategoryName: k, Items: _.flatMap(v, 'Items')})).value();

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