【问题标题】:AngularJS filter unique removing duplicates in ng-optionsAngularJS 过滤唯一删除 ng-options 中的重复项
【发布时间】:2016-01-31 08:21:06
【问题描述】:

我有一个数组:

$scope.arr1 = [option1, option2, option3, option1, option3]

我正在使用它来填充选择选项:

<select class="form-control" ng-model="arr1"
     ng-options="option for option in arr1">
     <option value="" disabled>Please select an option</option>
</select>

选项已填充,但我想从中删除重复项。我试过了:

ng-options="option for option in arr1 | unique: 'option'"

但它给出的结果是空的

【问题讨论】:

    标签: javascript html angularjs filter ng-options


    【解决方案1】:

    Angular 不提供任何开箱即用的过滤器来满足您的需求。

    您尝试使用 ng-options="option for option in arr1 | unique: 'option'",但在 Angular 中没有名为 unique 的过滤器。

    您可能想查看 angular here 中的可用过滤器。

    要获得所需的结果,您需要创建自定义过滤器来执行此操作。我在下面创建了一个 sn-p,它将过滤常用值。这应该适合你。

    var app = angular.module("myapp", []);
    app.controller("testCntrl", function($scope){
      $scope.arr1 = ['option1','option2','option3','option1','option3'];
      
    })
    .filter("removeDups", function(){
      return function(data) {
        if(angular.isArray(data)) {
          var result = [];
          var key = {};
          for(var i=0; i<data.length; i++) {
            var val = data[i];
            if(angular.isUndefined(key[val])) {
              key[val] = val;
              result.push(val);
            }
          }
          if(result.length > 0) {
            return result;
          }
        }
        return data;
      }
    })
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="myapp">
      <div ng-controller="testCntrl">
    <select class="form-control" ng-model="arr"
         ng-options="option for option in arr1 | removeDups">
         <option value="" disabled>Please select an option</option>
    </select>
        </div>
      </div>

    【讨论】:

      【解决方案2】:

      unique 不包含在 AngularJS 中 - this filter 与 AngularUI 上的旧版本捆绑在一起,并且似乎在 a8m/angular-filter 上也很常见。您可以在您的应用程序中对其进行改造、自行开发或包含一个提供模块。请注意以下...

      ng-options="option for option in arr1 | unique"
      

      // -- AngularUI implementation
      .filter('unique', function () {
      
        return function (items, filterOn) {
      
          if (filterOn === false) {
            return items;
          }
      
          if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {
            var hashCheck = {}, newItems = [];
      
            var extractValueToCompare = function (item) {
              if (angular.isObject(item) && angular.isString(filterOn)) {
                return item[filterOn];
              } else {
                return item;
              }
            };
      
            angular.forEach(items, function (item) {
              var valueToCheck, isDuplicate = false;
      
              for (var i = 0; i < newItems.length; i++) {
                if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) {
                  isDuplicate = true;
                  break;
                }
              }
              if (!isDuplicate) {
                newItems.push(item);
              }
      
            });
            items = newItems;
          }
          return items;
        };
      });
      

      JSFiddle Link - 工作演示

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-26
        相关资源
        最近更新 更多