Javascript angularJs从数组中排除已选择的项
我在$scope.currentSChannels.scgsLink中有一个对象数组。这个对象数组有如下内容 $scope.currentSChannels.scgsLink=[{channelId:1,sCgsLinkId:1,groupNo:1,percentage:50,expireHrs:4},{channelId:1,sCgsLinkId:2,groupNo:2,percentage:50,expireHrs:1}] 我还有下面的选择列表Javascript angularJs从数组中排除已选择的项,javascript,arrays,angularjs,angularjs-filter,Javascript,Arrays,Angularjs,Angularjs Filter,我在$scope.currentSChannels.scgsLink中有一个对象数组。这个对象数组有如下内容 $scope.currentSChannels.scgsLink=[{channelId:1,sCgsLinkId:1,groupNo:1,percentage:50,expireHrs:4},{channelId:1,sCgsLinkId:2,groupNo:2,percentage:50,expireHrs:1}] 我还有下面的选择列表 模板变得有点棘手。假设selectedLin
模板变得有点棘手。假设
selectedLink
是指向所选groupNo
ng-options="t.value as t.text for t in metaData.spGroups | filter: {value: '!' + currentSChannels.scgsLink[selectedLink].groupNo}"
请参见:第二个选择包含与第一个选择相同的集合,排除了已选择的集合
编辑:上述解决方案用于根据一个值排除元素。为了根据一组值排除元素,自定义过滤器最适合:
过滤器
app.filter('channelFilter', function () {
return function (metadata, exclusions) {
var filterFunction = function (metadata) {
// return the metadata object if exclusions array does NOT contain his groupNo
return !exclusions.some(function (exclusion) {
return exclusion.groupNo === metadata.value;
});
};
return metadatas.filter(filterFunction);
};
});
用法
模板
ng-options="t.value as t.text for t in metaData.spGroups | channelFilter: currentSChannels.scgsLink"
也就是说,通过
groupNo
对所选链接进行分组将更有效,以避免在数组中进行搜索,并在控制器中进行筛选 我想让它更通用一点,所以我做了以下工作
app.filter('excludeFrom',函数(){
返回函数(inputArray、excludeArray、excludeColumnName、inputColumnName){
如果(inputColumnName==未定义)
inputColumnName='值';
var filterFunction=函数(输入项){
return!excludeArray.some(函数(excludeItem){
返回excludeItem[excludeColumnName]==inputItem[inputColumnName];
});
};
返回inputArray.filter(filterFunction);
};
});代码>示例中的selectedLink是什么?我希望在要排除所有已选定组的筛选器中实现“不在筛选器中”。如我在示例中所示,我已经分配了两个组。我希望只允许选择不在该复杂属性中的组(该属性是一个对象数组,如我所示)。“我需要根据数组和该数组中的特定列进行筛选”。根据这句话,我认为你只需要过滤一项。如果您需要针对scgsLink
的所有元素进行过滤,我会定义一个自定义过滤器……这也是我的想法,但我并不清楚博客文章中的示例。它似乎只适用于一个项目。你能帮我写这个自定义过滤器吗?我会在其中传递一个数组和数组中的一个特定列来进行处理。顺便说一句,您的项目中有没有像lodash或下划线这样的js库?我已经搜索了解决方案,我们没有使用下划线.js,尽管我看到很少有评论说代码是从中借用的。我们已经用过了
ng-options="t.value as t.text for t in metaData.spGroups | channelFilter: currentSChannels.scgsLink"