从对象中取出具有无效(NaN、blank等)值的键的最佳方法



我有一个用户填写的简短搜索表单。将有多个搜索查询进入MongoDB:

表单创建了一个名为searchParams的变量,它可能看起来像这样:

var searchParams = {
  city: "Springfield",
  bedrooms: 3,
  bathrooms: 2
};

然后我有一个函数,它将searchParams作为参数,并使用它查询Mongo:

var searchListings = function(searchParams){
  return db.MyListings.find(searchParams).fetch();
}
db.MyListings.find( {city: "Springfield", bedrooms: 3, bathrooms: 2} ).fetch();

这对于一个完整的searchParams对象来说是很好的,但如果用户没有填写表单的部分内容,结果对象是这样的:

var searchParams = {
  city: "",
  bedrooms: NaN,
  bathrooms: 3
};

查询失败。它试图从字面上搜索一处城市为"、卧室为NaN的房产。

在这个对象的情况下,我希望查询只是:

  db.MyListings.find( {bathrooms: 3} ).fetch();

我可以逐一检查每个密钥,检查NaN条件和"条件,并以某种方式从searchParams对象中取出密钥(我想我想对对象进行消毒?)但我想知道是否有更智能的方法可以取出无效值的密钥?

我已经安装了underscore

更新:该项目目前正在使用Meteor 0.9.1。Meteor使用Underscore 1.0.0,这就是为什么下面的不起作用:

以下似乎不起作用:

searchParams = {
  bathrooms: 3,
  bedrooms: NaN,
  city: "",
  exteriorSize: NaN,
  interiorSize: NaN,
  price: 0
};
console.log(searchParams);
newSearchParams = _.omit(searchParams, function(val) { 
  return !val;
});
console.log(newSearchParams); // exactly the same as searchParams

如果我这样做:

searchParams = {
  bathrooms: 3,
  bedrooms: NaN,
  city: "",
  exteriorSize: NaN,
  interiorSize: NaN,
  price: 0
};
console.log(searchParams);
newSearchParams = _.pick(searchParams, function(val) { 
  return !!val;
});
console.log(newSearchParams); // blank object

使用underscore 1.7.0+,您可以轻松地使用_.pick()过滤查询对象:

searchParams = _.pick(searchParams, function(val) { 
  return !!val;
});

这将创建一个只具有那些被赋予truthy值的属性的对象。

您可以用_.omit():做同样的事情,但方式略有不同

searchParams = _.omit(searchParams, function(val) { 
  return !val;
});

在这种情况下,所有具有错误值的属性都将被删除。


为了完整起见,这里有一种普通的JS方式:

var filteredSearchParams = {};
for (var prop in searchParams) {
  if (searchParams.hasOwnProperty(prop) && !!searchParams[prop]) {
    filteredSearchParams[prop] = searchParams[prop];
  }
}

最新更新