当尝试使用未定义的属性进行过滤时,Lodash会排除项目

时间:2015-08-12 21:41:26

标签: javascript lodash

我正在使用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.typefilters.bar未定义...

如果我试图过滤的属性是未定义的还是假的,那么我是否可以使用lodash让项目通过_.where_.filter(或替代)?最好没有mixin,但如果你有一个优雅的解决方案,请随意分享。

1 个答案:

答案 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()