如何检查对象数组中是否存在指定对象并更新数量?
数组对象按
name去重并累加qty的实现方案 没问题,我来帮你搞定这个需求,核心逻辑就是先检查数组里有没有name属性匹配的对象,有就累加对应qty,没有就把新对象推入数组。直接上完整代码和细节解释:
完整实现(ES6简洁版)
var objArray = [ {"name":"bike","color":"blue","qty":2}, {"name":"boat","color":"pink", "qty":1}, ]; var carObj = {"name":"car","color":"red","qty":1}; var bikeObj = {"name":"bike","color":"blue","qty":1}; function checkAndAdd(obj) { // 查找数组中第一个name匹配的对象索引 const matchIndex = objArray.findIndex(item => item.name === obj.name); if (matchIndex !== -1) { // 找到匹配对象,累加qty值 objArray[matchIndex].qty += obj.qty; } else { // 未找到匹配对象,推入新对象 objArray.push(obj); } } // 测试效果 checkAndAdd(carObj); console.log(objArray); // 数组新增car对象 checkAndAdd(bikeObj); console.log(objArray); // bike的qty变为3(2+1)
兼容旧环境的for循环版本
如果你需要兼容不支持ES6的旧环境,可以用传统的for循环实现,逻辑完全一致:
function checkAndAdd(obj) { let isFound = false; // 遍历数组查找匹配对象 for (var i = 0; i < objArray.length; i++) { if (objArray[i].name === obj.name) { objArray[i].qty += obj.qty; isFound = true; break; // 找到后立即跳出循环,优化性能 } } // 没找到匹配项就推入新对象 if (!isFound) { objArray.push(obj); } }
关键细节说明
- 匹配规则:严格以
name属性作为判断是否为同一对象的依据,这是你需求的核心标准 - 累加逻辑:是将新对象的
qty值加到已有对象的qty上,而非固定加1(比如示例中bikeObj的qty是1,所以累加后原bike的qty从2变成3) - 性能优化:不管是
findIndex还是带break的for循环,都会在找到第一个匹配项后停止遍历,避免不必要的计算
内容的提问来源于stack exchange,提问作者Joe82
相关产品推荐
相关产品推荐

