You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查对象数组中是否存在指定对象并更新数量?

数组对象按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:46:21