С помощью 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))