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
相关产品推荐
相关产品推荐

