AngularJS 过滤唯一删除 ng-options 中的重复项
AngularJS filter unique removing duplicates in ng-options
我有一个数组:
$scope.arr1 = [option1, option2, option3, option1, option3]
我正在用它来填充 select 选项:
<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'"
但结果为空
Angular 不提供任何开箱即用的过滤器来实现您的需要。
您尝试使用 ng-options="option for option in arr1 | unique: 'option'"
,但在 angular 中没有名为 unique
的过滤器。
您可能想查看 angular here 中的可用过滤器。
要获得您想要的结果,您需要创建自定义过滤器来执行此操作。我在下面创建了一个片段,它将过滤常见的值。这应该适合你。
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>
unique
不包含在 AngularJS - this filter is bundled with older versions on AngularUI, and also appears to be commonly available at 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 - 工作演示
我有一个数组:
$scope.arr1 = [option1, option2, option3, option1, option3]
我正在用它来填充 select 选项:
<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'"
但结果为空
Angular 不提供任何开箱即用的过滤器来实现您的需要。
您尝试使用 ng-options="option for option in arr1 | unique: 'option'"
,但在 angular 中没有名为 unique
的过滤器。
您可能想查看 angular here 中的可用过滤器。
要获得您想要的结果,您需要创建自定义过滤器来执行此操作。我在下面创建了一个片段,它将过滤常见的值。这应该适合你。
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>
unique
不包含在 AngularJS - this filter is bundled with older versions on AngularUI, and also appears to be commonly available at 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 - 工作演示