我正在使用复选框进行过滤,我的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和过滤代码,以确保没有冲突。
<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>
答案 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);
}