Условно задано свойство объекта
Есть ли какой-то синтаксис для задания свойств на основе условия?
data: {
userId: 7,
actionId: 36,
express: (myCondition ? true : null) // does not work
}
Я хочу, чтобы express
либо был установлен на значение, либо вообще не был установлен (т.е. не должно быть ключа с именем express
) и без дополнительных инструкций после определения. Я знаю, что могу использовать его как логическое, но принимающая сторона использует проверку isset()
, и мне интересно, не могу ли я ее изменить.
Изменить. По-видимому, нет прямого решения проблемы, как указано. Вот те самые предложения:
JSON.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 (бывший мой коллега):
eval("data = {userId: 7, actionId: 36 " + (myCondition ? ", express: true}" : "}"))
Условное определение (не знаю, как это обозначить):
data = (
(myCondition && { userId: 7, actionId: 36, express: true }) ||
(!myCondition && { userId: 7, actionId: 36 })
);
Ответы
Ответ 1
Сделайте это так:
data: {
userId: 7,
actionId: 36,
express: (myCondition ? true : undefined)
}
Свойство, значение которого undefined
не записывается, когда вы stringify объект в JSON.
EDIT: Из комментариев видно, что на самом деле JSON не участвует. OP использует $.ajax
, поэтому $.param
, вероятно, используется. $.param
, к сожалению, создает запись для свойств со значением undefined
. Таким образом, возможно, нет решения без какой-либо дополнительной строки кода.
Ответ 2
Вы можете сделать это, если вы определяете свой объект с помощью анонимной функции вместо обозначения литерала объекта:
var data = new function(){
this.userId = 7;
this.actionId = 36;
myCondition && (this.express = true);
};
Результирующий объект data
является тем же самым, кроме него constructor
будет анонимной функцией вместо window.Object
.
Ответ 3
Вы можете сделать что-то вроде этого:
var json = JSON.stringify( {
data: {
userId: 7,
actionId: 36,
express: (myCondition ? true : null)
}
});
Ответ 4
в первую очередь, это javascript, а не JSON.
решение:
data: {
userId: 7,
actionId: 36
}
if(myCondition) data["express"] = true;
Ответ 5
Используйте оператор распространения.
data: {
userId: 7,
actionId: 36,
...myCondition && {express: true}
}
Обратите внимание, что если вы используете Flow, этот синтаксис может генерировать ошибки проверки типа. Вы можете написать выше, явным образом и менее лаконично, так как:
data: {
userId: 7,
actionId: 36,
...(myCondition ? {express: true} : {})
}
Ответ 6
Немного устарел, но есть хорошее решение, которое вы можете сделать:
data: {
userId: 7,
actionId: 36
}
Object.assign(data, !myCondition && { express: yourValue });
Таким образом, он присваивает вашему экспресс-функции значение, которое вам нужно, если ваше условие ложно.