【问题标题】:Group and merge in nested object using Lodash使用 Lodash 在嵌套对象中分组和合并
【发布时间】:2019-01-27 15:46:11
【问题描述】:

我有一个对象数据如下:

[
    {
        name: "Green Tea Brownie",
        price: 60,
        amount: 10,
        seller: {
            seller_id: 124,
            seller_name: "Merry Shop"
        }      
    },
    {
        name: "Cocoa Chiffon",
        price: 20,
        amount: 50,
        seller: {
            seller_id: 124,
            seller_name: "Merry Shop"          
        }      
    },
    {
        name: "Milky Donut",
        price: 40,
        amount: 100
        seller: {
            seller_id: 421,
            seller_name: "Sweet Bakery"   
        }      
    }
]

所以我想按“seller_id”对数据进行分组,并合并分配给对象名称“orders”的顶级数据,如下所示:

[
    {
        seller_id: 124,
        seller_name: "Merry Shop",
        orders: [
            {
                name: "Green Tea Brownie",
                price: 60,
                amount: 10
            },
            {
                name: "Cocoa Chiffon",
                price: 20,
                amount: 50
            }
        ]
    },
    {
        seller_id: 421,
        seller_name: "Sweet Bakery",
        orders: [
            {
                name: "Milky Donut",
                price: 40,
                amount: 100
            }
        ]
    }
]

几个小时前我试图解决这个问题。谁能解决这个案子?

谢谢

【问题讨论】:

  • 请分享您到目前为止所做的尝试以及您遇到的具体问题。
  • 请参阅“如何创建一个最小、完整和可验证的示例”:stackoverflow.com/help/mcve 该网站并非旨在提供预期输入和输出的免费代码。
  • 谢谢,我会仔细阅读的

标签: javascript object multidimensional-array lodash


【解决方案1】:

您可以使用_.groupBy() 然后_.map() 组来请求格式:

const { flow, partialRight: pr, groupBy, map, first, omit } = _

const fn = flow(
  pr(groupBy, 'seller.seller_id'),
  pr(map, group => ({
    ...first(group).seller,
    orders: map(group, pr(omit, 'seller'))
  }))
)

const data = [{"name":"Green Tea Brownie","price":60,"amount":10,"seller":{"seller_id":124,"seller_name":"Merry Shop"}},{"name":"Cocoa Chiffon","price":20,"amount":50,"seller":{"seller_id":124,"seller_name":"Merry Shop"}},{"name":"Milky Donut","price":40,"amount":100,"seller":{"seller_id":421,"seller_name":"Sweet Bakery"}}]

const result = fn(data)

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

【讨论】:

    【解决方案2】:

    如果你喜欢使用纯 JS,你可以使用 reduce

    const data = [{"name":"Green Tea Brownie","price":60,"amount":10,"seller":{"seller_id":124,"seller_name":"Merry Shop"}},{"name":"Cocoa Chiffon","price":20,"amount":50,"seller":{"seller_id":124,"seller_name":"Merry Shop"}},{"name":"Milky Donut","price":40,"amount":100,"seller":{"seller_id":421,"seller_name":"Sweet Bakery"}}]
    
    
    const output = data.reduce((op,{name,price,amount,seller})=>{
      if(op[seller['seller_id']]){
        op[seller['seller_id']]['orders'].push({name,price,amount})
       }
      else {
        op[seller['seller_id']] = {
          seller_name: seller.seller_name,
          seller_id: seller.seller_id,
          orders: [{name,price,amount}]
        }
      }
     return op;
    },{})
    
    console.log(Object.values(output))

    【讨论】:

      【解决方案3】:

      这是一个使用 reduce 的纯 JS 解决方案:

      const orders = [{
          name: "Green Tea Brownie",
          price: 60,
          amount: 10,
          seller: {
              seller_id: 124,
              seller_name: "Merry Shop"
          }      
      }, {
          name: "Cocoa Chiffon",
          price: 20,
          amount: 50,
          seller: {
              seller_id: 124,
              seller_name: "Merry Shop"          
          }      
      }, {
          name: "Milky Donut",
          price: 40,
          amount: 100,
          seller: {
              seller_id: 421,
              seller_name: "Sweet Bakery"   
          }      
      }];
      
      const ordersBySeller = Object.values(orders.reduce((accum, { name, price, amount, seller: { seller_id, seller_name } }) => {
        const sellerOrders = accum[seller_id] ? accum[seller_id].orders || [] : [];
        accum[seller_id] = { seller_id, seller_name, orders: [...sellerOrders, { name, price, amount } ] };
        return accum;
      }, {}));
      
      console.log(ordersBySeller);

      【讨论】:

      • 没有 Lodash 它看起来更复杂,但它的工作,谢谢你
      猜你喜欢
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2016-06-12
      • 2019-12-31
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多