63

是否有一些基于条件设置属性的语法?

data: {
    userId: 7,
    actionId: 36,
    express: (myCondition ? true : null) // does not work
}

我想express要么设置为一个值,要么根本不设置(即,不应该有名为 的键express),并且在定义之后没有额外的语句。我知道我可以将它用作布尔值,但接收方正在使用isset()支票,我想知道是否可以避免修改它。


编辑:似乎没有直接解决问题的方法。以下是最接近的建议:

JSON.stringify(克里斯凯塞尔,dystroy):

var json = JSON.stringify( {
    data: {
        userId: 7,
        actionId: 36,
        express: (myCondition ? true : null)
    }
});

匿名函数(Paulpro):

var data = new function(){
    this.userId = 7;
    this.actionId = 36;
    myCondition && (this.express = true);
};

一个额外的声明(x4rf41):

data: {
    userId: 7,
    actionId: 36
}
if(myCondition) data["express"] = true;

Eval(我的前同事):

eval("data = {userId: 7, actionId: 36 " + (myCondition ? ", express: true}" : "}"))

条件定义(不知道怎么标注这个):

data = (
    (myCondition && { userId: 7, actionId: 36, express: true }) ||
    (!myCondition && { userId: 7, actionId: 36 })
);
4

7 回答 7

79

使用展开运算符

data: {
    userId: 7,
    actionId: 36,
    ...myCondition && {express: true}
}

请注意,如果您使用Flow,该语法可能会生成类型检查错误。您可以将上述内容写得更明确,更简洁,如下:

data: {
    userId: 7,
    actionId: 36,
    ...(myCondition ? {express: true} : {})
}
于 2017-10-20T21:36:23.727 回答
69

像这样做 :

data: {
    userId: 7,
    actionId: 36,
    express: (myCondition ? true : undefined)
}

将对象字符串化为JSONundefined时不会写入其值的属性。


编辑:从评论中看来,实际上没有涉及 JSON。OP 正在使用$.ajax所以$.param可能被使用。$.param不幸的是,它确实为值为 的属性创建了一个条目undefined。因此,如果没有任何补充代码行,可能就没有解决方案。

于 2013-08-02T14:52:32.407 回答
9

如果您使用匿名函数而不是对象文字表示法定义对象,则可以这样做:

var data = new function(){
    this.userId = 7;
    this.actionId = 36;
    myCondition && (this.express = true);
};

结果data对象完全相同,只是它将constructor是匿名函数而不是window.Object.

于 2013-08-02T15:16:32.903 回答
3

你可以这样做:

var json = JSON.stringify( {
    data: {
        userId: 7,
        actionId: 36,
        express: (myCondition ? true : null)
    }
});
于 2013-08-02T14:51:43.563 回答
2

有点旧,但也有一个很好的解决方案,你可以这样做:

data: {
    userId: 7,
    actionId: 36
}

Object.assign(data, !myCondition && { express: yourValue });

因此,如果您的条件为假,它将为您的 express 属性分配您需要的值。

于 2017-08-23T09:08:15.060 回答
1

首先,那是 javascript,而不是 JSON。

解决方案:

data: {
    userId: 7,
    actionId: 36
}
if(myCondition) data["express"] = true;
于 2013-08-02T14:48:32.170 回答
0

扩展运算符现在解决了这个问题。这是一个带有两个比较的示例。

注意:我更改date:const date = 使其成为有效的可运行 javascript。data:如果它应该位于深层对象结构内部,也可以使用它。

const compareValue = 13;
const data =  {
    userId: 7,
    actionId: 36,
    ...(compareValue > 10 && {propertyForGreaterThan10: 'foo'}),
    ...(compareValue < 10 && {propertyForLessThan10: 'bar'}),
}
console.log(data);

于 2021-10-13T05:29:04.827 回答