假设getStyles 是您自己的方法,当然,您可以给make、model 和year 默认值。您还可以为要解构的整个对象设置默认值,这样调用者就不必传递 任何东西:
function getStyles({make = '', model = '', year = '-1'} = {}) {
// Overall default ------------------------------------^^^^^
return // ...
}
问题不在于如何组织/编写我的函数,而是如何使用 es6 功能编写更简洁的代码,以便与 mongo 一起使用。即,如果用户没有传递任何我想要返回的所有样式,但 mongo 实际上会查找空字段,因此它不会返回任何内容。
听起来你不想要默认参数(可能除了整体默认值)。相反,您希望自动构建传递给find 的对象。
鉴于您的代码示例,您可以在对象上使用 Object.keys 轻松做到这一点。所以接受作为一个对象,例如:
function getStyles(options = {}) {
...然后基于options 构建您的find 选项:
const findParams = {};
Object.keys(options).forEach(key => {
findParams[key + ".niceName"] = options[key];
});
活生生的例子:
function getStyles(options = {}) {
const findParams = {};
Object.keys(options).forEach(key => {
findParams[key + ".niceName"] = options[key];
});
console.log(`find options: ${JSON.stringify(findParams)}`);
}
let results = getStyles({make: "Ford", model: "Mustang"});
results = getStyles({make: "Ford", model: "Mustang", year: 2017});
如果将您接受的名称 (make) 映射到您需要的名称 find (make.niceName) 并不像附加 .niceName 那样简单,那么拥有一个 @987654337 就足够简单了@(或只是对象)您构建一次:
const paramNames = new Map([
["make", "make.niceName"],
["model", "model.niceName"],
["year", "year.niceName"]
]);
...然后使用:
const findParams = {};
Object.keys(options).forEach(key => {
const paramName = paramNames.get(key);
if (paramName) {
findParams[paramName] = options[key];
}
});
活生生的例子:
const paramNames = new Map([
["make", "make.niceName"],
["model", "model.niceName"],
["year", "year.niceName"]
]);
function getStyles(options = {}) {
const findParams = {};
Object.keys(options).forEach(key => {
const paramName = paramNames.get(key);
if (paramName) {
findParams[paramName] = options[key];
}
});
console.log(`find options: ${JSON.stringify(findParams)}`);
}
let results = getStyles({make: "Ford", model: "Mustang"});
results = getStyles({make: "Ford", model: "Mustang", year: 2017});
旁注:默认值不一定是字符串,因此如果您使用数字表示year 而不是字符串,则默认值将是-1,而不是'-1'。