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); }); };
代码说明
- 修正变量名:统一使用
$scope.usersHotel,彻底避免拼写错误导致的逻辑中断。 - 空值处理:先判断
usersHotel是否为空,为空时直接返回所有酒店,避免后续逻辑出错。 - 高效查找:通过
map提取已关联酒店的code并存入Set,查找时间复杂度从O(n)降到O(1),比嵌套循环高效很多。 - 清晰筛选:用
filter方法直接过滤酒店数组,逻辑直观,不会产生重复数据。
这样修改后,就能正确得到你想要的结果:[{code:3, namehotel:'z1'}, {code:4, namehotel:'t1'}]
内容的提问来源于stack exchange,提问作者Emen Emen
相关产品推荐
相关产品推荐

