如何对带有父级和子级的嵌套数组进行分组?

问题描述 投票:0回答:1

我的 JSON 数组有问题。我认为它嵌套的第一个分组是按_id分组,第二个是按itemId分组,我不知道如何解决它,请帮助我

 let data=[
   {
    "_id" : "013",
    "items" : [
        {
            "itemId" : "4",
            "stockIn" : 50,
            "stockOut" : 0
        },
        {
            "itemId" : "9",
            "stockIn" : 100,
            "stockOut" : 0
        }
    ]
  },
  {
    "_id" : "013",
    "items" : [
        {
            "itemId" : "3",
            "noFreeQtyCount" : 20,
            "freeQtyCount" : 0
        },
        {
            "itemId" : "9",
            "noFreeQtyCount" : 30,
            "freeQtyCount" : 0
        }
    ]
  }
 ]

这是我想要的数据

[
   {
    "_id" : "013",
    "items" : [
        {
            "itemId" : "3",
            "noFreeQtyCount" : 20,
            "freeQtyCount" : 0
        },
        {
            "itemId" : "4",
            "stockIn" : 50,
            "stockOut" : 0
        },
        {
            "itemId" : "9",
            "stockIn" : 100,
            "stockOut" : 0
            "noFreeQtyCount" : 30,
            "freeQtyCount" : 0
        }
    ]
  },
 ]

这是我的脚本,请帮忙

 const groupBy = data.reduce((acc, cur) => {
acc[cur._id] ? acc[cur._id].items = [...acc[cur._id].items, ...cur.items] : acc[cur._id] = cur;
return acc;
 }, {});

const 输出 = groupBy; 打印(输出);

javascript lodash
1个回答
0
投票

您可以使用

Object.key()
Array.prototype.map()
Object.assign()
完成您需要的分组。

参考以下代码:

const data = [
  {
    "_id": "013",
    "items": [
      {"itemId": "4", "stockIn": 50, "stockOut": 0},
      {"itemId": "9", "stockIn": 100, "stockOut": 0},
    ],
  },
  {
    "_id": "013",
    "items": [
      {"itemId": "3", "noFreeQtyCount": 20, "freeQtyCount": 0},
      {"itemId": "9", "noFreeQtyCount": 30, "freeQtyCount": 0},
    ],
  },
];

const mergedData = {};

data.forEach(entry => {
  const _id = entry["_id"];
  const items = entry["items"];

  if (!mergedData[_id]) {
    mergedData[_id] = {};
  }

  items.forEach(item => {
    const itemId = item["itemId"];

    if (!mergedData[_id][itemId]) {
      mergedData[_id][itemId] = {};
    }

    Object.assign(mergedData[_id][itemId], item);
  });
});

const result = Object.keys(mergedData).map(_id => {
  return {"_id": _id, "items": Object.values(mergedData[_id])};
});

console.log(result);

© www.soinside.com 2019 - 2024. All rights reserved.