我有一个用户填写的简短搜索表单。将有多个搜索查询进入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];
}
}