如何检查JavaScript对象指定key是否匹配嵌套值并更新quantity字段
方案说明
你现有的指定productId查询的逻辑本身时间复杂度就是O(1),已经是最优效率,所谓「效率低」其实是写法上有冗余,可以先把目标对象提前取出避免重复访问,优化后同时可以直接修改quantity属性:
场景1:已知要查询的key(productId)
// 提前取出目标对象,避免重复读取cart[productId] const target = cart[productId] if ( target && target.quantity >= 1 && target.FirstName === FirstName && target.LastName === LastName ) { // 直接修改属性即可,嵌套对象是引用类型,修改会直接生效 target.quantity += 1 }
这里把==替换为严格相等===,可以避免隐式类型转换带来的非预期匹配问题。
场景2:不知道具体key,需要遍历所有条目找匹配项
如果你没有指定productId,需要从整个购物车中找出所有符合字段要求的条目,可以遍历对象值操作:
// 遍历所有条目修改所有匹配项 Object.values(cart).forEach(item => { if (item.quantity >= 1 && item.FirstName === FirstName && item.LastName === LastName) { item.quantity += 1 } }) // 只匹配第一个符合要求的条目 const matchedItem = Object.values(cart).find(item => item.quantity >= 1 && item.FirstName === FirstName && item.LastName === LastName ) matchedItem && (matchedItem.quantity += 1)
可扩展优化
如果后续需要匹配的字段变多,可以封装通用匹配函数,简化判断逻辑:
const matchItem = (item, conditions) => { return Object.entries(conditions).every(([key, rule]) => { return typeof rule === 'function' ? rule(item[key]) : item[key] === rule }) } // 使用示例 const conditions = { FirstName: FirstName, LastName: LastName, quantity: val => val >= 1 } const target = cart[productId] if (target && matchItem(target, conditions)) { target.quantity += 1 }
内容的提问来源于stack exchange,提问作者pycode81
相关产品推荐
相关产品推荐

