如何在角度过滤器中包含“字符串包含”功能

时间:2015-12-22 15:37:53

标签: javascript angularjs angularjs-ng-repeat angularjs-filter

我正在使用复选框进行过滤,我的geojson具有状态属性。状态值是这样的:

  

状态   :   “第3Q99号法案”

  

状态   :   “Fut 3Q99”

我需要按“Act”或“Fut”过滤。这是我的过滤器:

   function StatusFilter() {

    return function (territorySubdivisions, typeFilter) {
        var filtered = [];
        angular.forEach(territorySubdivisions, function (subdivision) {
            if (typeFilter.active == true && typeFilter.future == true) {
                filtered.push(subdivision);
            }
            else if (typeFilter.active == true && typeFilter.future == false && subdivision.properties.status == subdivision.properties.status.indexOf('Act') != -1) {
                filtered.push(subdivision);
            }
            else if (typeFilter.future == true && typeFilter.active == false && subdivision.properties.status == subdivision.properties.status.indexOf('Fut') != -1) {
                filtered.push(subdivision);
            }
        });
        return filtered;
    };
};

这是我尝试过的。

  

subdivision.properties.status.indexOf('Act')!= -1

它当然不起作用。我创造了一个工作的plunker。我包含了其他orderBy和过滤代码,以确保没有冲突。

working plunker

   <div class="col-xs-3">
            <div class="checkbox checkbox-success checkbox-inline">
                <input type="checkbox" id="active-checkbox-filter" ng-model="vm.typeFilter.active" ng-change="vm.statusActive('active')">
                <label for="active-checkbox-filter"> Active </label>
            </div>
        </div>
        <div class="col-xs-3">
            <div class="checkbox checkbox-success checkbox-inline">
                <input type="checkbox" id="future-checkbox-filter" ng-model="vm.typeFilter.future" ng-change="vm.statusFuture('future')">
                <label for="future-checkbox-filter"> Future </label>
            </div>
        </div>

2 个答案:

答案 0 :(得分:3)

这里有@Mate答案的一些重构,主要是为了坚持不要重复自己&#34;不要重复自己&#34;原理:

var active = typeFilter.active;
var future = typeFilter.future;
var status = subdivision.properties.status;

var match = (active && future) ||
            (active && !future && status.indexOf('Act') >= 0) ||
            (future && !active && status.indexOf('Fut') >= 0);

if (match) {
    filter.push(subdivision);
}

请注意,一旦获得布尔match答案,您只需使用Array.filter来生成结果,而不是使用.push累积结果 - 它在MSIE上受支持9+,因此它可以在AngularJS支持的任何浏览器上运行,将上面的代码减少到:

function StatusFilter() {
    return function (territorySubdivisions, typeFilter) {
        return territorySubdivisions.filter(function(subdivision) {
            var active = typeFilter.active;
            var future = typeFilter.future;
            var status = subdivision.properties.status;

           return (active && future) ||
                  (active && !future && status.indexOf('Act') >= 0) ||
                  (future && !active && status.indexOf('Fut') >= 0);          
        });
    } 
}

答案 1 :(得分:1)

你的代码看起来很奇怪。你不需要这个:

if (typeFilter.active === true && typeFilter.future === true) {
    filtered.push(subdivision);
} else if (typeFilter.active === true && typeFilter.future === false && subdivision.properties.status.indexOf('Act') >= 0) {
    filtered.push(subdivision);
} else if (typeFilter.future === true && typeFilter.active === false && subdivision.properties.status.indexOf('Fut') >= 0) {
    filtered.push(subdivision);
}

相关问题