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

AngularJS中如何检查ID是否存在于数组并添加不存在元素

检查ID是否存在并添加到数组的实现方案

先提个小细节:你代码里外层和内层循环都用了var i,因为var的变量提升特性,这会导致循环变量互相干扰,逻辑很容易出错,建议改成let或者换个变量名(比如内层用j),先把这个潜在问题修复掉。

回到你的核心需求:要检查deposits[i]._id是否存在于vm.usableDeposits中,不存在就把对应元素推进去。因为vm.usableDeposits是对象数组,不能直接用includes(它只会判断是否存在相同的对象引用),我们可以用Array.some()方法来判断是否有元素的_id匹配目标ID。

修改后的完整代码示例

var vm = this;
vm.usableDeposits = [];
// 外层循环改用let避免变量提升问题,也可以换成idx这类变量名
for (let i = 0; i < billableChargeCodes.length; i++) {
  var deposits = usableDeposits.filter(function(ud) {
    return ud.billinggroupuid == billableChargeCodes[i].billinggroupuid || 
           ud.billinggroupuid == billableChargeCodes[i].billingsubgroupuid || 
           ud.departmentuid == billableChargeCodes[i].departmentuid || 
           !ud.entypeuid || 
           ud.entypeuid == entypeuid;
  });
  // 内层循环换用j,避免和外层i冲突
  for (let j = 0; j < deposits.length; j++) {
    var deposit = deposits[j];
    var depositid = deposit._id;
    // 检查数组中是否已存在相同_id的元素
    const isExist = vm.usableDeposits.some(item => item._id === depositid);
    if (!isExist) {
      vm.usableDeposits.push(deposit);
    }
  }
}

关键步骤解释

  • 用Array.some()做存在性检查:some()会遍历数组,只要有一个元素满足item._id === depositid的条件就返回true,否则返回false,刚好适合判断ID是否已存在。
  • 修复循环变量冲突:把var改成let,或者换不同的变量名,这样每个循环的变量都是独立的,不会出现外层循环被内层干扰的情况。
  • 直接推入目标元素:如果ID不存在,就把当前的deposit对象直接推入vm.usableDeposits,完全符合你的需求。

如果你的运行环境支持ES6+语法,还可以用Set来优化ID检查的效率(尤其是数组元素较多时),检查的时间复杂度能降到O(1):

var vm = this;
vm.usableDeposits = [];
// 用Set存储已存在的ID,快速判断
const existingIds = new Set();

for (let i = 0; i < billableChargeCodes.length; i++) {
  var deposits = usableDeposits.filter(function(ud) {
    return ud.billinggroupuid == billableChargeCodes[i].billinggroupuid || 
           ud.billinggroupuid == billableChargeCodes[i].billingsubgroupuid || 
           ud.departmentuid == billableChargeCodes[i].departmentuid || 
           !ud.entypeuid || 
           ud.entypeuid == entypeuid;
  });

  for (let j = 0; j < deposits.length; j++) {
    var deposit = deposits[j];
    var depositid = deposit._id;
    if (!existingIds.has(depositid)) {
      existingIds.add(depositid);
      vm.usableDeposits.push(deposit);
    }
  }
}

内容的提问来源于stack exchange,提问作者Raghul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:35:37