AngularJS中如何判断响应数组对象是否存在于另一数组?
问题分析与解决方案
你的核心问题在于异步请求未同步处理,加上重复判断逻辑错误,导致每次操作时数组被反复累加重复项。下面是修复后的实现方案,完全兼容你的需求(不使用箭头函数):
原代码的关键问题
- 异步请求并行处理时,直接操作
secondArray会导致竞态问题,多个请求的结果互相覆盖或重复追加 - 重复判断逻辑错误:嵌套
forEach会导致只要有一个元素name不匹配就追加整个respArray,完全起不到去重作用 - 笔误:
secondArray = response应该是secondArray = respArray
修复后的代码
self.getDropdown = function (firstArray) { // 1. 过滤出需要触发请求的选中项 var activeTypes = firstArray.filter(function (type) { return type.selectActive; }); // 2. 为每个选中项创建请求Promise var requestPromises = activeTypes.map(function (type) { return $service.getDropdownReq(self.info); }); // 3. 等待所有请求完成后统一处理结果 $q.all(requestPromises).then(function (allResponses) { // 4. 合并所有接口返回的数组 var combinedArray = []; allResponses.forEach(function (respArray) { combinedArray = combinedArray.concat(respArray); }); // 5. 基于name属性高效去重 var seenNames = {}; var uniqueArray = combinedArray.filter(function (item) { if (!seenNames[item.name]) { seenNames[item.name] = true; return true; } return false; }); // 6. 更新第二个多选框的数据源 secondArray = uniqueArray; // 若使用AngularJS,视图未刷新时需手动触发脏检查:$scope.$apply() }); };
代码说明
- 请求同步:用
$q.all等待所有选中项的接口请求完成,确保一次性处理所有结果,避免异步竞态 - 合并数组:先把所有接口返回的数组合并成一个大数组,再统一去重,逻辑更清晰
- 高效去重:用对象
seenNames记录已出现的name,时间复杂度O(n),比嵌套循环的O(n²)高效得多 - 全量更新:每次操作直接替换
secondArray为去重后的新数组,从根源避免重复累加的问题
额外注意事项
- 如果你的项目是AngularJS,更新
secondArray后如果视图没刷新,可能需要调用$scope.$apply()触发脏检查 - 确保
$service.getDropdownReq返回的是Promise(AngularJS的$http默认返回Promise)
内容的提问来源于stack exchange,提问作者LaraGrimci
相关产品推荐
相关产品推荐

