如何使用 lodash 对具有内部对象的对象进行分组?

How to group by objects with inside objects with lodash?

我正在使用 Typescript 和 Lodash!

从数据库中获取数据后,我得到以下输出:

[
  {
    "unitPrice": 0.01,
    "code": "92365524",
    "description": "Broto gratis (chocolate)",
    "menu": {
      "code": "1DFD0",
      "name": "Promoção"
    }
  },
  {
    "unitPrice": 0,
    "code": "060d6fcf1c0d3663a1747dd249afa4db",
    "description": "BROTO",
    "menu": {
      "code": "1CZSR",
      "name": "Cardápio americano (broto)"
    }
  },
  {
    "unitPrice": 0,
    "code": "ac91957034d03e818968b46663a61826",
    "description": "BROTO",
    "menu": {
      "code": "1CZSR",
      "name": "Cardápio americano (broto)"
    }
  }
]

我想按 Menu 对象分组,我尝试了很多,但我还没有接近得到它。我不知道该怎么做。我正在使用 lodas,但我需要使用另一个库来执行此操作吗?

这就是我需要的端点响应,它看起来很容易做到,但我无法弄清楚:

{
  "menu": [
    {
      "code": "1CZSR",
      "name": "Cardápio americano (broto)",
      "itens": [
        {
          "unitPrice": 0.01,
          "code": "92365524",
          "description": "Broto gratis (chocolate)"
        }
      ]
    },
    {
      "code": "1DFD0",
      "name": "Promoção",
      "itens": [
        {
          "unitPrice": 0,
          "code": "060d6fcf1c0d3663a1747dd249afa4db",
          "description": "BROTO",
        },
        {
          "unitPrice": 0,
          "code": "ac91957034d03e818968b46663a61826",
          "description": "BROTO",
        }
      ]
    }
  ]
}

经过多次尝试,这是我最接近我想要的响应的代码。

const data = _.mapValues(_.groupBy(results, 'menu.code'), (menuItem) =>
      menuItem.map((item) => _.omit(item, 'menu')),
    );

但输出是:

{
  "1CZSR":[
    {
      "unitPrice": 0.01,
      "code": "92365524",
      "description": "Broto gratis (chocolate)"
    }
  ],
  "1DFD0": [
    {
      "unitPrice": 0,
      "code": "060d6fcf1c0d3663a1747dd249afa4db",
      "description": "BROTO",
    },
    {
      "unitPrice": 0,
      "code": "ac91957034d03e818968b46663a61826",
      "description": "BROTO",
    }
  ]
}

我忘记了什么?

这是一个相当简单的组通过使用 vanilla js 和一些解构

const res = Object.values(
    data.reduce((a, {menu: {code, name}, ...rest}) => {
       a[code] = a[code] || {code, name, items: []};
       return  a[code].items.push({...rest}), a;      
    },{})
);

console.log(res)
.as-console-wrapper {max-height: 100%!important;top:0;}
<script>
const data=[{unitPrice:.01,code:"92365524",description:"Broto gratis (chocolate)",menu:{code:"1DFD0",name:"Promoção"}},{unitPrice:0,code:"060d6fcf1c0d3663a1747dd249afa4db",description:"BROTO",menu:{code:"1CZSR",name:"Cardápio americano (broto)"}},{unitPrice:0,code:"ac91957034d03e818968b46663a61826",description:"BROTO",menu:{code:"1CZSR",name:"Cardápio americano (broto)"}}];
</script>