有条件地设置对象属性

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

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

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


编辑 : 似乎没有直接的解决方案,如上所述。以下是近似的建议:

Stringify (Chris Kessel,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("data = {userId: 7, actionId: 36 " + (myCondition ? ", express: true}" : "}"))

条件定义 (不知道如何给这个定义贴标签) :

data = (
(myCondition && { userId: 7, actionId: 36, express: true }) ||
(!myCondition && { userId: 7, actionId: 36 })
);
79073 次浏览

首先,这是 javascript,不是 JSON。

解决办法:

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

你可以这样做:

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

这样做:

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

将对象 串起来写入 JSON 时,不会写入值为 undefined的属性。


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

如果使用匿名函数而不是对象文字符号定义对象,就可以这样做:

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

得到的 data对象是完全相同的,除了它的 constructor将是匿名函数而不是 window.Object

虽然有点老,但还是有个不错的解决办法:

data: {
userId: 7,
actionId: 36
}


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

因此,如果您的条件为 false,它将用您需要的值来分配 Express 属性。

使用 扩散算符扩散算符

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

注意,如果使用 流动,该语法可能会生成类型检查错误。您可以将上面的内容写得更明确、更不简洁,比如:-

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

扩展运算符现在修正了这个问题。

注意: 我将 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);