[英]Use lodash groupBy function to categorize objects in an array
我有一系列產品,每個產品都有一個類別對象。 我需要按類別組織並包括類別對象。 GroupBy函數僅包含一個參數。
產品系列
const data = [
{id: 1, 'name': 'produto1', category: {id: 1, name: 'shirts', description: 'super roupa'}},
{id: 2, 'name': 'produto2', category: {id: 1, name: 'shirts', description: 'super roupa'}},
{id: 3, 'name': 'produto3', category: {id: 2, name: 'jackets', description: 'super jackets'}},
{id: 4, 'name': 'produto4', category: {id: 2, name: 'jackets', description: 'super jackets'}},
]
預期結果:
[
{
category: {id: 1, name: 'clothes', description: 'super roupa'},
products:[{id:1, name: 'produt1'}, {id: 2, name: 'produto1'} ]
},
{
category: {id: 2, name: 'jackets', description: 'super jackets'},
products:[{id:3, name: 'produt3'}, {id: 4, name: 'produto4'} ]
},
]
由組category.id
,然后通過取映射每個組到對象category
從第一項目組中的,並省略category
從所有產品:
const data = [{"id":1,"name":"produto1","category":{"id":1,"name":"shirts","description":"super roupa"}},{"id":2,"name":"produto2","category":{"id":1,"name":"shirts","description":"super roupa"}},{"id":3,"name":"produto3","category":{"id":2,"name":"jackets","description":"super jackets"}},{"id":4,"name":"produto4","category":{"id":2,"name":"jackets","description":"super jackets"}}] const result = _(data) .groupBy('category.id') .map(group => ({ category: _.head(group).category, products: _.map(group, o => _.omit(o, 'category')) })) .value() console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
或與lodash / fp等效的_.flow()
函數:
const { flow, groupBy, map, head, omit } = _ const fn = flow( groupBy('category.id'), map(group => ({ category: head(group).category, products: map(omit('category'), group) })) ) const data = [{"id":1,"name":"produto1","category":{"id":1,"name":"shirts","description":"super roupa"}},{"id":2,"name":"produto2","category":{"id":1,"name":"shirts","description":"super roupa"}},{"id":3,"name":"produto3","category":{"id":2,"name":"jackets","description":"super jackets"}},{"id":4,"name":"produto4","category":{"id":2,"name":"jackets","description":"super jackets"}}] const result = fn(data) console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
這是一個沒有lodash的解決方案:
您可以reduce
數據數組。 解構的參數來獲取category
和rest
分開的屬性。 rest
將具有id
和name
屬性。 然后使用每個唯一類別的id
作為鍵創建一個累加器對象。 將值設置為輸出中所需的最終對象。 如果密鑰已經存在,請更新它的products
數組。 否則,向累加器添加一個新密鑰。 然后,最后使用Object.values()
將該累加器對象轉換為所需值的數組
const data = [{"id":1,"name":"produto1","category":{"id":1,"name":"shirts","description":"super roupa"}},{"id":2,"name":"produto2","category":{"id":1,"name":"shirts","description":"super roupa"}},{"id":3,"name":"produto3","category":{"id":2,"name":"jackets","description":"super jackets"}},{"id":4,"name":"produto4","category":{"id":2,"name":"jackets","description":"super jackets"}}] const merged = data.reduce((acc, { category, ...rest }) => { acc[category.id] = acc[category.id] || { category, products: [] }; acc[category.id].products.push(rest); return acc; }, {}) console.log(Object.values(merged))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.