You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过_id匹配categories与count数组并合并为含name和count的对象

问题:合并两个数组并过滤无效项

我有两个数组categories和count,均包含_id字段。需求是根据_id匹配两个数组中的对象,合并为仅包含name和count的新对象,同时排除_id为null的项。尝试用map方法实现但结果不符合预期,相关数据及代码如下:

原始数据

{
  "count": [
    {
      "_id": "63d18ade150a09494a7922ba",
      "count": 1
    },
    {
      "_id": "63d18ab8150a09494a792298",
      "count": 1
    },
    {
      "_id": null,
      "count": 1
    },
    {
      "_id": "63d18ab8150a09494a79229a",
      "count": 2
    },
    {
      "_id": "63d18ab8150a09494a792299",
      "count": 2
    }
  ],
  "categories": [
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a792298",
      "name": "Agriculter & Food",
      "enabled": false,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a792299",
      "name": "Animals & Pets",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a79229a",
      "name": "Babies & Kids",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a79229b",
      "name": "Commercial & Equipment & Tools",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a79229e",
      "name": "Health & Beauty",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a79229f",
      "name": "Home, Furniture & Appliances",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a7922a0",
      "name": "Jobs",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a7922a1",
      "name": "Mobile Phones & Tablets",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a7922a2",
      "name": "Property",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a7922a3",
      "name": "Repair & Construction",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a7922a4",
      "name": "Services",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a7922a5",
      "name": "Sports, Arts & Outdoors",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a7922a6",
      "name": "Vehicles",
      "enabled": true,
      "isDeleted": false,
      "__v": 0,
      "mobile_image": "imgName-1675366698075.png",
      "image": "imgName-1675367702205.png"
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a79229c",
      "name": "Electronics",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "image": "",
      "mobile_image": "",
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63d18ab8150a09494a79229d",
      "name": "Faishon",
      "enabled": true,
      "isDeleted": false,
      "__v": 0
    },
    {
      "createdDate": "2023-03-13T15:29:11.104Z",
      "_id": "63ed51eb047ccbe75d91a982",
      "name": "Example",
      "enabled": true,
      "isDeleted": false,
      "image": "",
      "mobile_image": "",
      "__v": 0
    }
  ]
}

尝试的代码

const result = categorycount.map(obj1 => {
  const matchingObj2 = categories.find(obj2 => obj2._id === obj1._id);
  if (matchingObj2) {
    return {
      matchingObj2                              
    };
  } else {
    return null;
  }
}).filter(obj => obj !== null);

问题分析与解决方案

原代码存在三个问题:

  1. 未排除count数组中_id为null的项
  2. 返回的对象结构错误,直接将匹配到的matchingObj2作为属性值,而非提取name与count合并
  3. 未处理count中存在但categories里没有的_id(比如63d18ade150a09494a7922ba)

修正后的代码步骤:

  1. 先过滤count数组,移除_id为null的项
  2. 将categories转为Map提升查找效率(数组规模较大时效果更明显)
  3. 遍历过滤后的count,匹配对应分类名称,生成仅包含name和count的新对象
  4. 过滤掉无匹配分类的项

修正代码

// 构建分类ID到名称的映射表
const categoryMap = new Map(categories.map(cat => [cat._id, cat.name]));

const result = count
  // 过滤_id为null的无效项
  .filter(item => item._id !== null)
  .map(item => {
    const name = categoryMap.get(item._id);
    // 仅保留有匹配名称的项
    return name ? { name, count: item.count } : null;
  })
  // 移除无匹配的null项
  .filter(item => item !== null);

最终结果示例

result的输出内容为:

[
  { "name": "Agriculter & Food", "count": 1 },
  { "name": "Babies & Kids", "count": 2 },
  { "name": "Animals & Pets", "count": 2 }
]

内容的提问来源于stack exchange,提问作者Smitty's

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:07:05