查找某个项是否在数组中,并将其从带有angularjs的选项中排除

时间:2014-11-04 08:54:29

标签: javascript angularjs

我有两个范围(数组)。一个有房间数据,一个有房间清单。 因此,每当用户想要为每个房间添加一些数据时,必须从下拉列表中选择它(选择选项)并添加他想要的数据。 现在,我需要排除每个房间已经有一些来自下拉列表的数据,我正在尝试像这样。

这是房间清单:

$scope.propertyRooms = [
    {
        id: "1",
        name: "Room 1 Sea View"
    },
    {
        id: "2",
        name: "Room 2 Mountain View"
    },
    {
        id: "3",
        name: "Room 3"
    }

];

这是有数据的房间(要排除):

$scope.ratePlansRoomsSettings = [
            {
                id: "1",
                name: "Room 1 Sea View",
                allotment: "10",
                minPax: "1",
                maxPax: "5",
                maxAdult: "5",
                maxChild: "4",
                maxInf: "1",
                childAllowed: true
            },
            {
                id: "2",
                name: "Room 2 Mountain View",
                allotment: "10",
                minPax: "1",
                maxPax: "10",
                maxAdult: "10",
                maxChild: "8",
                maxInf: "1",
                childAllowed: false
            }
        ];

以下是我尝试排除所选内容的方法:

$scope.getAvailableRooms = function(){
    var selectedRooms = [];

    for(i = 0; i < $scope.propertyRooms.length; i++){
        var found = false;
        for(j = 0; j < $scope.ratePlansRoomsSettings.length; j++){
            if($scope.ratePlansRoomsSettings[j].id == $scope.propertyRooms[i].id){
                found = true;
                break;
            }
        }
        if(!found){
            selectedRooms.push($scope.propertyRooms[i]);
        }
        return $scope.propertyRooms;

    }

}

这是选择选项:

<select ng-model="room.name" ng-options="p.name as p.name for p in getAvailableRooms()" ng-hide="room.name" class="form-control"></select>

问题在于,选择选项可以让我从propertyRooms范围获得所有房间的所有时间,而不是那些仅未被选中的房间。

我没有收到任何错误,但我相信我在for函数中错了。

1 个答案:

答案 0 :(得分:1)

我认为这应该有效:

$scope.getAvailableRooms = function(){
    var selectedRooms = [];

    for(i = 0; i < $scope.propertyRooms.length; i++){
        var found = false;
        for(j = 0; j < $scope.ratePlansRoomsSettings.length; j++){
            if($scope.ratePlansRoomsSettings[j].id == $scope.propertyRooms[i].id){
                found = true;
                break;
            }
        }
        if(!found){
            selectedRooms.push($scope.propertyRooms[i]);
        }
    }
    return selectedRooms;
}

但是,您是否考虑过使用过滤器?您可以按照here所述编写自定义过滤器。这里只是一个例子:

.filter('rooms', function() {
    return function(input) {
      var selectedRooms = [];

      for(i = 0; i < input.length; i++){
          var found = false;
          for(j = 0; j < $scope.ratePlansRoomsSettings.length; j++){
              if($scope.ratePlansRoomsSettings[j].id == input[i].id){
                  found = true;
                  break;
              }
          }
          if(!found){
              selectedRooms.push(input[i]);
          }
      }
      return selectedRooms;
    };
  })