PHP实现分类下多产品分组数组:求助合并分类与产品数组
如何将分类数组与产品数组合并为按分类分组的结构
我来帮你搞定这个数组合并的问题!先基于常见场景给出示例数据和解决方案,你可以对照自己的实际情况调整。
示例数据
假设你的分类数组和产品数组是这样的:
分类数组:
const categories = [ { id: 1, name: "电子产品" }, { id: 2, name: "家居用品" }, { id: 3, name: "服饰" } ];
产品数组:
const products = [ { id: 101, name: "手机", categoryId: 1 }, { id: 102, name: "电视", categoryId: 1 }, { id: 103, name: "沙发", categoryId: 2 }, { id: 104, name: "T恤", categoryId: 3 }, { id: 105, name: "床单", categoryId: 2 } ];
常见的错误尝试(可能是你遇到的问题)
很多人一开始会用find匹配产品,但find只会返回第一个匹配项,导致每个分类下只有一个产品:
// 错误示例:只能拿到每个分类下的第一个产品 const wrongMerged = categories.map(category => { return { ...category, products: products.find(product => product.categoryId === category.id) }; });
预期输出(假设你想要的结果)
[ { "id": 1, "name": "电子产品", "products": [ { "id": 101, "name": "手机", "categoryId": 1 }, { "id": 102, "name": "电视", "categoryId": 1 } ] }, { "id": 2, "name": "家居用品", "products": [ { "id": 103, "name": "沙发", "categoryId": 2 }, { "id": 105, "name": "床单", "categoryId": 2 } ] }, { "id": 3, "name": "服饰", "products": [ { "id": 104, "name": "T恤", "categoryId": 3 } ] } ]
正确解决方案
方案一:高效版(适合大数据量)
先把产品按分类ID分组,再和分类数组匹配,性能更优:
// 第一步:创建产品的分类映射表,把相同分类的产品归到一起 const productCategoryMap = products.reduce((map, product) => { const catId = product.categoryId; // 如果映射表中没有这个分类ID,就初始化一个空数组 if (!map[catId]) { map[catId] = []; } map[catId].push(product); return map; }, {}); // 第二步:遍历分类数组,匹配对应产品 const mergedResult = categories.map(category => { return { ...category, // 复制分类的所有属性 // 从映射表中取对应分类的产品,没有的话返回空数组 products: productCategoryMap[category.id] || [] }; }); console.log(mergedResult);
方案二:简洁版(适合小数据量)
如果你的数据量不大,直接用filter就能快速实现:
const mergedResult = categories.map(category => ({ ...category, // 过滤出当前分类下的所有产品 products: products.filter(product => product.categoryId === category.id) }));
注意事项
- 确保分类的
id和产品的categoryId类型完全一致(比如都是数字或者都是字符串),否则会匹配失败。 - 如果有些分类下没有产品,上述两种方案都会返回空数组,避免出现
undefined影响后续逻辑。
内容的提问来源于stack exchange,提问作者Raheel Aslam
相关产品推荐
相关产品推荐

