我正在使用lodash _.where
来过滤数组。当filters
的属性未定义时,lodash会尝试匹配未定义的值,而不是完全忽略该属性。
var list = [{
type: 'something',
units: [{bar: 1}]
}];
var filters = {};
var filteredlist = _(list)
.where(filters.type ? {
type: filters.type
} : {})
.where(filters.view === 'foo' && filters.bar ? {
units: [{
bar: +filters.bar
}]
} : {})
.value();
filteredlist;
以上内容会返回list
中的单独项目。
但在使用filters
或_.where
过滤我的_.filter
之前,我必须检查list
中的属性是否存在。
如果我只是这样做:
var filteredlist = _(list)
.where({
type: filters.type,
units: [{
bar: +filters.bar
}]
})
.value();
我没有得到任何回复,因为filters.type
和filters.bar
未定义...
如果我试图过滤的属性是未定义的还是假的,那么我是否可以使用lodash让项目通过_.where
或_.filter
(或替代)?最好没有mixin,但如果你有一个优雅的解决方案,请随意分享。
答案 0 :(得分:0)
我认为这可能是你正在寻找的目标:
_(list).filter(function (item) {
return _.has(filters, 'type') ? _.isEqual(filters.type, item.type) : true;
}).value()
但是,如果您需要检查过滤器中的所有键,那么您可能需要这样做:
_(list).filter(function (item) {
var pass = true;
_.each(filters, function (v, k) {
if (!_.isEqual(item[k], v)) {
pass = false;
}
});
return pass;
}).value()