我想根据某些条件从列表中过滤掉某些对象:
var list = [
{ mode: 1, type: 'foo' },
{ mode: 2, type: 'foo' },
{ mode: 3, type: 'foo' }, // remove this item
{ mode: 1, type: 'bar' },
{ mode: 2, type: 'bar' },
{ mode: 3, type: 'bar' }
];
var blah = $.grep(list, function(x){
if(x.type === 'foo')
return x.mode !== 3;
else
return true;
});
console.log('result 1:', blah);
这正如预期的那样有效。
我的问题是我有一个从我的服务器作为 JSON 发送的过滤器:
var blah = list;
var filter = [
{ propertyName: 'mode', value: 3 },
{ propertyName: 'type', value: 'foo' }
];
$.each(filter, function(k, filterRow){
blah = $.grep(blah, function(listItem){
return listItem[filterRow.propertyName] === filterRow.value;
});
});
这显然会过滤掉太多,但这只是为了让您了解它是如何工作的。
我想知道的是您对过滤器应该如何过滤掉与我的第一个示例中相同数量的行的建议。
不,我不想传递表达式并使用 eval()
。
如果有什么不清楚的地方请告诉我。
最佳答案
最好使用 [].filter
和 [].every
。
这是我的解决方案:
var list = [
{ mode: 1, type: 'foo' },
{ mode: 2, type: 'foo' },
{ mode: 3, type: 'foo' }, // remove this item
{ mode: 1, type: 'bar' },
{ mode: 2, type: 'bar' },
{ mode: 3, type: 'bar' }
];
var blah = list;
var filter = [{ propertyName: 'mode', value: 3 }, { propertyName: 'type', value: 'foo' }];
var filtered = list.filter(function(listItem) {
return !filter.every(function(filterItem) {
return listItem[filterItem.propertyName] === filterItem.value;
});
});
console.log(filtered);
关于javascript - 使用 $.grep() 基于自定义过滤器过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17444877/