如何通过_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);
问题分析与解决方案
原代码存在三个问题:
- 未排除
count数组中_id为null的项 - 返回的对象结构错误,直接将匹配到的
matchingObj2作为属性值,而非提取name与count合并 - 未处理
count中存在但categories里没有的_id(比如63d18ade150a09494a7922ba)
修正后的代码步骤:
- 先过滤
count数组,移除_id为null的项 - 将
categories转为Map提升查找效率(数组规模较大时效果更明显) - 遍历过滤后的
count,匹配对应分类名称,生成仅包含name和count的新对象 - 过滤掉无匹配分类的项
修正代码
// 构建分类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
相关产品推荐
相关产品推荐

