求助:如何使用JavaScript过滤两个不同长度的对象数组,筛选匹配颜色与尺码的商品?
解决方案:匹配两个对象数组的尺码与颜色
没问题,我来帮你搞定这个数组过滤的问题!你的需求很明确——从productList里挑出和shoppingCart中颜色(对应color_code)+尺码匹配的商品,下面是两种可行的实现方式,我会详细解释思路:
高效实现(推荐)
如果你的数组数据量比较大,推荐用这种方式,通过集合(Set)来优化查找效率:
let productList= [ { "color_code": "DDFFBB", "size": "S", "stock": 3 }, { "color_code": "DDFFBB", "size": "M", "stock": 5 }, { "color_code": "CCCCCC", "size": "S", "stock": 4 }, { "color_code": "CCCCCC", "size": "M", "stock": 1 }, { "color_code": "BB7744", "size": "S", "stock": 2 }, { "color_code": "BB7744", "size": "M", "stock": 6 } ]; let shoppingCart=[ { "id": 201807202150, "color": "DDFFBB", "size": "M" }, { "id": 201807202150, "color": "BB7744", "size": "M" }, { "id": 201807202150, "color": "DDFFBB", "size": "S" } ]; // 第一步:把购物车中的匹配规则转换成唯一标识的集合 const cartMatchKeys = new Set( shoppingCart.map(item => `${item.color}-${item.size}`) ); // 第二步:过滤产品列表,保留符合规则的项 const filteredProducts = productList.filter(product => { const productKey = `${product.color_code}-${product.size}`; return cartMatchKeys.has(productKey); }); console.log(filteredProducts);
思路说明
- 预处理购物车规则:把
shoppingCart里的每个条目,用颜色-尺码的字符串格式生成唯一标识,存到Set中。Set的查找是O(1)时间复杂度,比嵌套循环快很多。 - 过滤产品列表:遍历
productList,对每个产品生成同样格式的标识,检查是否在Set里——如果存在,就说明这个产品和购物车中的某条记录匹配,保留它。
简易实现(适合小数据量)
如果你的数组规模很小,也可以直接用嵌套判断的方式,代码更简洁:
const filteredProducts = productList.filter(product => { // 检查购物车中是否存在匹配的颜色和尺码 return shoppingCart.some(item => item.color === product.color_code && item.size === product.size ); });
思路说明
用filter遍历产品列表,对每个产品,用some方法检查shoppingCart里是否有任意一条记录满足颜色(color对应color_code)和尺码的匹配条件。这种方式代码短,但数据量大时性能不如Set方案。
两种方式运行后,都会得到你期望的输出:
[ { "color_code": "DDFFBB", "size": "S", "stock": 3 }, { "color_code": "DDFFBB", "size": "M", "stock": 5 }, { "color_code": "BB7744", "size": "M", "stock": 6 } ]
内容的提问来源于stack exchange,提问作者Taiwan No.1
相关产品推荐
相关产品推荐

