angularJs从数组中排除已选择的项目

时间:2015-10-26 18:30:16

标签: 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}]

我还有以下选择列表

mv testFile.txt DirB_abs

我需要过滤该列表,以便不在$ scope.currentSChannels.scgsLink groupNo列中显示已选择的项目。我查看了http://christian.fei.ninja/Angular-Filter-already-selected-items-from-ng-options/以及AngularJS ng-options to exclude specific object,两者似乎都很接近,但还不够,因为我需要过滤数组和该数组中的特定列。我该如何实施过滤?

2 个答案:

答案 0 :(得分:2)

模板变得有点棘手。假设selectedLink是指向所选groupNo

的变量
ng-options="t.value as t.text for t in metaData.spGroups | filter: {value: '!' + currentSChannels.scgsLink[selectedLink].groupNo}"

请参阅 this fiddle :第二个选择包含与第一个相同的集合,已排除已选择的内容。

编辑 :上面的解决方案是根据一个值排除元素。为了根据值集合排除元素,自定义过滤器最适合:

过滤

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="metadata in metadatas | channelFilter: exclusions"

<强>模板

ng-options="t.value as t.text for t in metaData.spGroups | channelFilter: currentSChannels.scgsLink"

<强> Fiddle

也就是说,通过groupNo对所选链接进行分组会更有效,以避免在阵列中进行搜索,并在控制器中进行过滤。

答案 1 :(得分:1)

我想让它更通用一点,所以我做了以下

http://jsfiddle.net/96m4sfu8/

&#13;
&#13;
app.filter('excludeFrom', function () {
    return function (inputArray, excludeArray, excludeColumnName, inputColumnName) {
        if (inputColumnName==undefined)
            inputColumnName = 'value';
		var filterFunction = function (inputItem) {
            return !excludeArray.some(function (excludeItem) {
                return excludeItem[excludeColumnName] === inputItem[inputColumnName];
            });
        };

        return inputArray.filter(filterFunction);
    };
});
&#13;
&#13;
&#13;