多条件过滤两个数组异常:属性变更后返回空数组如何修复?
问题修复方案
核心问题分析
你的代码输出空数组,主要有两个原因:
- 属性名错误:示例对象中使用了JS关键字
const作为属性名(非法),且代码中比较的是cost,属性名不匹配导致比较逻辑异常; - 逻辑范围不符预期:当前代码仅从
productos数组筛选,若你期望保留prevProductos中的变更对象,逻辑方向需要调整。
修复方案
情况1:保留productos中与prevProductos属性有差异的对象
先修正属性名(将const改为合法的cost),确保比较字段一致:
const productos = [{ prodId: 3, amount: 30, cost: 100 // 修正属性名,避免关键字冲突 }]; const prevProductos = [{ prodId: 3, amount: 20, cost: 100 }]; let addedProducts = productos.filter(item => !prevProductos.some(obj => obj.prodId === item.prodId && obj.amount === item.amount && obj.cost === item.cost ) ); console.log(addedProducts); // 输出:[{ prodId: 3, amount: 30, cost: 100 }]
情况2:保留两个数组中所有属性有差异的对象(含两边的变更项)
合并两个数组的筛选结果,覆盖所有差异对象:
const productos = [{ prodId: 3, amount: 30, cost: 100 }]; const prevProductos = [{ prodId: 3, amount: 20, cost: 100 }]; // 筛选productos中独有的/变更的对象 const fromProductos = productos.filter(item => !prevProductos.some(obj => obj.prodId === item.prodId && obj.amount === item.amount && obj.cost === item.cost ) ); // 筛选prevProductos中独有的/变更的对象 const fromPrev = prevProductos.filter(item => !productos.some(obj => obj.prodId === item.prodId && obj.amount === item.amount && obj.cost === item.cost ) ); // 合并结果 const addedProducts = [...fromProductos, ...fromPrev]; console.log(addedProducts); // 输出:[{ prodId: 3, amount: 30, cost: 100 }, { prodId: 3, amount: 20, cost: 100 }]
情况3:期望输出prevProductos中的变更对象(与你的示例期望一致)
调整筛选的目标数组为prevProductos:
const productos = [{ prodId: 3, amount: 30, cost: 100 }]; const prevProductos = [{ prodId: 3, amount: 20, cost: 100 }]; let addedProducts = prevProductos.filter(item => !productos.some(obj => obj.prodId === item.prodId && obj.amount === item.amount && obj.cost === item.cost ) ); console.log(addedProducts); // 输出:[{ prodId: 3, amount: 20, cost: 100 }]
内容的提问来源于stack exchange,提问作者alexgarciaalcuadrado
相关产品推荐
相关产品推荐

