首页 > 解决方案 > 在NodeJS中按另一个数组的项对数组进行分组

问题描述

我在 NodeJS 中有 2 个数组:

var dataCms = ["BIG BIKE","CUB","MATIC","SPORT"];

var outJSON = [
            {
                "id": "42513b49-9bd8-11e9-a417-560001ead144",
                "series": "GENIO",
                "cms": "MATIC"
            },
            {
                "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
                "series": "VARIO",
                "cms": "MATIC"
            },
            {
                "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
                "series": "BEAT",
                "cms": "MATIC"
            },
            {
                "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
                "series": "SUPRA",
                "cms": "CUB"
            },
            {
                "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
                "series": "SONIC",
                "cms": "SPORT"
            },
            {
                "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
                "series": "REVO",
                "cms": "CUB"
            },
            {
                "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a8900",
                "series": "GENIO",
                "cms": "MATIC"
            }
        ];

我想通过数组 dataCms 对数组 outJSON 进行分组,如下所示:

{
    "BIGBIKE":[],
    "CUB": [
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "SUPRA"
        },
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "REVO"
        }
    ],
    "MATIC": [
        {
            "id": "42513b49-9bd8-11e9-a417-560001ead144",
            "series": "GENIO"
        },
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "VARIO"
        },
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "BEAT"
        },
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a8900",
            "series": "GENIO"
        }
    ],
    "SPORT": [
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "SONIC"
        }
    ]
}

我试过这样:

    let groups = Object.create(null);
    
    outJSON.forEach(item => {
    if (!groups[item.cms]) {
         groups[item.cms] = [];
    }
    
    groups[item.cms].push({
         id: item.id,
         series: item.series
    });
            });
    
    let result =
         Object.entries(groups)
         .map(([k, v]) => ({[k] : v}));
    
         console.log(result);
         return res.json(groups);

但我得到的结果是这样的:

{
    "MATIC": [
        {
            "id": "42513b49-9bd8-11e9-a417-560001ead144",
            "series": "GENIO"
        },
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "VARIO"
        },
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "BEAT"
        },
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a8900",
            "series": "GENIO"
        }
    ],
    "CUB": [
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "SUPRA"
        },
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "REVO"
        }
    ],
    "SPORT": [
        {
            "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
            "series": "SONIC"
        }
    ]
}

我想要 dataCms 中的项目是否在 outJson 中没有相同的项目仍然显示但长度为 0。

标签: node.jsarraysgrouping

解决方案


您应该遍历这些值dataCms以确保它们都作为键出现在您的输出中。outJSON然后您可以根据值过滤cms值并创建一个对象,该对象是outJSON没有cms键的值以推入结果数组:

var dataCms = ["BIG BIKE", "CUB", "MATIC", "SPORT"];

var outJSON = [{
    "id": "42513b49-9bd8-11e9-a417-560001ead144",
    "series": "GENIO",
    "cms": "MATIC"
  },
  {
    "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
    "series": "VARIO",
    "cms": "MATIC"
  },
  {
    "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
    "series": "BEAT",
    "cms": "MATIC"
  },
  {
    "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
    "series": "SUPRA",
    "cms": "CUB"
  },
  {
    "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
    "series": "SONIC",
    "cms": "SPORT"
  },
  {
    "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
    "series": "REVO",
    "cms": "CUB"
  },
  {
    "id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a8900",
    "series": "GENIO",
    "cms": "MATIC"
  }
];

groups = dataCms.map(c => ({
  [c]: outJSON.filter(v => v.cms == c)
    .map(o => ({
      id: o.id,
      series: o.series
    }))
}));
console.log(groups);


推荐阅读