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

Angular对象数组取差集异常:hotelsName数组始终为空

解决Angular中筛选两个对象数组无交集元素的问题

我来帮你梳理下代码里的问题,然后给出正确的实现方案:

问题根源

你的代码里有两个核心问题导致hotelsName始终为空:

  • 变量名拼写不一致:你把接口返回的数据赋值给了$scope.usersHotel,但后续判断和循环却用了$scope.userHotels(多了一个s),这直接导致循环代码块根本没执行,自然hotelsName是空数组。
  • 筛选逻辑错误:就算变量名改对了,嵌套forEach的逻辑也不对——它会把每个和当前userHotel不匹配的酒店都push进去,最后会产生大量重复数据,完全不是你想要的「无交集筛选」结果。

正确实现方式

我们可以换一种更高效清晰的思路:先收集usersHotel里所有已关联的酒店code,再用这个集合去过滤hotels数组,只保留不在集合里的元素。

修改后的代码

// 初始化数组,避免多次调用函数时数据累积
$scope.hotelsName = []; 

$scope.getHotelByUserName = function (id) { 
  UsersService.getHotelByUserName(id)
    .then(function(data){ 
      $scope.usersHotel = data; 
      
      // 处理空数据情况:如果没有关联酒店,直接返回全部酒店
      if(!$scope.usersHotel || $scope.usersHotel.length === 0){
        $scope.hotelsName = [...$scope.hotels];
        return;
      }

      // 收集所有已关联的酒店code,用Set优化查找效率
      const linkedHotelCodes = new Set(
        $scope.usersHotel.map(item => item.hotel.code)
      );

      // 过滤hotels数组,只保留未关联的酒店
      $scope.hotelsName = $scope.hotels.filter(
        hotel => !linkedHotelCodes.has(hotel.code)
      );
    })
    .catch(function onFail(errorResponse) { 
      console.error('Error while getting Hotel By User Name'); 
      console.log(errorResponse); 
    }); 
};

代码说明

  1. 修正变量名:统一使用$scope.usersHotel,彻底避免拼写错误导致的逻辑中断。
  2. 空值处理:先判断usersHotel是否为空,为空时直接返回所有酒店,避免后续逻辑出错。
  3. 高效查找:通过map提取已关联酒店的code并存入Set,查找时间复杂度从O(n)降到O(1),比嵌套循环高效很多。
  4. 清晰筛选:用filter方法直接过滤酒店数组,逻辑直观,不会产生重复数据。

这样修改后,就能正确得到你想要的结果:[{code:3, namehotel:'z1'}, {code:4, namehotel:'t1'}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:26:55