“Syntactic Sugar”用于设置对象属性,如果值是真实的

时间:2017-04-12 17:53:10

标签: javascript ecmascript-6

我不知道这是否存在但在我的项目中我有很多解析和验证。我以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...) 或循环对象的属性并过滤掉虚假值?

5 个答案:

答案 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;