对不起,这是我在这里的第一个答案。我为这样的过滤数组制作了自定义过滤器。
假设我们有这样的 JSON 对象数组:
var myArray=[{prop1:"val1", prop2:"val2", ...}, ...]
搜索参数在property name : property value 对中定义,其结构应如下所示:
var examplePairs={
prop1:"val1",
prop2:["val2", "val3"],
prop4:{eqStart:true, eqEnd:false, iStart:123, iEnd: 321}
};
此示例在数组中搜索属性prop1 具有值val1 和属性prop2 具有值val2 或val3 并且属性prop3 来自区间[123,321> 的所有匹配项
注意:对于区间搜索,数组中对象内的数据必须是数字(不应该不带引号定义)。
cmets中有解释。
对于您的特定案例呼叫过滤器,如下所示:
{{ pairs={HeaderText:['Latitude', 'Longitude'], Visible:true} }}
<span ng-repeat="col in row.Columns | jsonArrayMultiFilter : pairs >
或者像这样从控制器调用过滤器:
var pairs={HeaderText:['Latitude', 'Longitude'], Visible:true}
$scope.row.Columns=$filter('jsonArrayMultiFilter')($scope.row.Columns, pairs);
自定义过滤代码:
.filter('jsonArrayMultiFilter', function() {
return function(x, pairs) {
//filters
//pairs = property:value pairs
//in case same properties can have multiple value pairs should be defined as followed
// {property:[value1, value2]}
//if value of property fits inside interval it should be defined as followed
// {property:{eqStart:true, eqEnd:false, iStart:"start of interval", iEnd:"end of interval"}}
// if value in data is string it searches if string contains searched value
var keys=Object.keys(pairs);
//console.log(keys);
var newData=[];
var counter, tempCount, expression;
for (var i=0;i<x.length;i++){
//iterate data then apply multiple filters
//set counter value 0 for each itteration trough data
//if all pairs satisfies conditions counter should equal (keys.length - 1)
//for effitiency when condition is not satisfied loop should be broken on first fail
counter=0;
for (var j=0; j < keys.length; j++ ){
//iterrate through pairs
if (pairs[keys[j]].constructor === Array){
//if property has multiple values itterate trough values
tempCount=counter;
for (var k=0; k < pairs[keys[j]].length; k++){
//create regexp to perform case insensitive search
var rExp = new RegExp(pairs[keys[j]][k], "i");
//if value is a string expression searches the string if it is number finds exact match
expression=(typeof x[i][keys[j]] == 'string' || x[i][keys[j]] instanceof String)?x[i][keys[j]].search(rExp)>-1:x[i][keys[j]]==pairs[keys[j]][k];
if (expression){
counter++;
}
}
if (tempCount==counter){
//break itteration because one condition isn't satisfied for data x[i]
break;
}
}else{
//if not array but is object and property['iStart'] is not null and not undefined check if value is from interval
if( typeof pairs[keys[j]]['iStart'] !== 'undefined' && pairs[keys[j]]['iStart'] !== null ){
// if value is from interval
var leftLimit=pairs[keys[j]]['eqStart']?x[i][keys[j]] >= pairs[keys[j]]['iStart']:x[i][keys[j]] > pairs[keys[j]]['iStart'];
var rightLimit=pairs[keys[j]]['eqEnd']?x[i][keys[j]] <= pairs[keys[j]]['iEnd']:x[i][keys[j]] < pairs[keys[j]]['iEnd'];
if (leftLimit && rightLimit){
counter++;
}
else{
//break itteration because one condition isn't satisfied for data x[i]
break;
}
}else{
//create regexp to perform case insensitive search
var rExp = new RegExp(pairs[keys[j]], "i");
//if value is a string expression searches the string if it is number finds exact match
expression=(typeof x[i][keys[j]] == 'string' || x[i][keys[j]] instanceof String)?x[i][keys[j]].search(rExp)>-1:x[i][keys[j]]==pairs[keys[j]];
//if property has one value make comparsion
if (x[i][keys[j]]==pairs[keys[j]]){
counter++;
}
else {
//break itteration because condition isn't satisfied for data x[i]
break;
}
}
}
//if all conditions are satisfied
if (counter >= keys.length){
newData.push(x[i]);
}
}
}
return newData;
};
})