我不知道这是否存在但在我的项目中我有很多解析和验证。我以5-10 + <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jslint-maven-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<id>default-cli</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<jar>${jslint.jar}</jar>
<options>${jslint.options}</options>
<predef>${jslint.predef}</predef>
<sourceJsFolder>
${basedir}/src/main/js
</sourceJsFolder>
<!-- Sets the encoding of the js files beign read -->
<encoding>utf8</encoding>
</configuration>
</execution>
</executions>
</plugin>
行结束。
我可以走if(value) object.value = value
但是该对象具有假值的属性。
即。 (这不是生产代码只是为了让你知道我在说什么)
object.value = value || (your favorite falsy value)
有没有人知道更优雅的方式来做这样的事情,而不是做let filter = {}
let thing = ctx.query.thing
thing = Validation.validateThingy(thing)
if(thing) filter.thing = thing
// +50 more param parsing/request body parsing
return DB.find(filter).then(etc...)
或循环对象的属性并过滤掉虚假值?
答案 0 :(得分:2)
您可以使用函数,包含对象,键和值。
function setValue(object, key, value) {
if (value) {
object[key] = value;
}
}
// usage
let filter = {};
setValue(filter, 'thing', Validation.validateThingy(ctx.query.thing));
或者您可以在函数
中移动验证部分function setValue(object, key) {
var value = Validation.validateThingy(ctx.query[key])
if (value) {
object[key] = value;
}
}
// usage
let filter = {};
setValue(filter, 'thing');
答案 1 :(得分:2)
你可以滥用&&
的短路评估并说出thing && (filter.thing = thing)
,但它比你的imo更加丑陋。我认为你拥有的东西或抽象的功能都是更好的选择。
答案 2 :(得分:1)
怎么样:
thing && (filter.thing = thing);
答案 3 :(得分:0)
我的不好,OP清楚地说:
......没有做||或循环对象的属性并过滤出虚假值?
......我错过了它。以下就是这样。
对于没有OP偏好的未来读者:
您可以收集对象中的值,然后使用实用程序函数循环遍历这些值并仅复制真正的值:
let values = {};
values.thing = Validation.validateThingy(ctx.query.thing);
// +50 others...
let filter = copyTruthy({}, values);
return DB.find(filter).then(/*etc...*/);
其中copyTruthy
是:
function copyTruthy(dest, source) {
for (const key of Object.keys(source)) {
if (source[key]) {
dest[key] = source[key];
}
}
return dest;
}
答案 4 :(得分:0)
使用三元表达作为独立语句将起作用。
value ? (object.value = value) : null;