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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:28:30