Подтвердить что ты не робот

Условно задано свойство объекта

Есть ли какой-то синтаксис для задания свойств на основе условия?

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 })
);
4b9b3361

Ответ 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 });

Таким образом, он присваивает вашему экспресс-функции значение, которое вам нужно, если ваше условие ложно.