2013-08-02 3 views
22

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

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

Я хочу express быть либо установлен на значение или не установлен вообще (то есть, не должно быть никакого ключа с именем express), и без дополнительных заявлений после определения. Я знаю, что могу использовать его как логическое, но принимающая сторона использует проверку isset(), и мне интересно, не могу ли я ее изменить.


Edit: Кажется, нет прямого решения проблемы, как указано. Вот близкие предложения:

JSON.stringify (Chris Кессель, 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 }) 
); 
+0

, когда вы говорите «не установлен на всех», вы имеете в виду, что свойство существует, но имеет значение 'undefined', или свойство не существует ? – jbabey

+0

Я имею в виду, что собственность не должна существовать вообще. – mcmlxxxvi

+0

@mcmlxxxvi Я думаю, вы имели в виду свойства объекта, а не свойства JSON. В вашем вопросе нет JSON. – Paulpro

ответ

21

Делают это так:

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

Свойство, значение которого undefined не написано когда вы stringify объект JSON.

EDIT: Из комментариев видно, что на самом деле нет JSON. OP использует $.ajax, поэтому, возможно, используется $.param. $.param, к сожалению, создает запись для свойств, значение которых равно undefined. Таким образом, вероятно, нет решения без какой-либо дополнительной строки кода.

+0

Я просто доставляю его на звонок AJAX, и он не убирается - я явно не строю его ATM. – mcmlxxxvi

+0

Я не знаю вашего API, но почти уверен, что он вызывает JSON.stringify. Даже если это не так, норма не позволяет передавать неопределенное значение, поэтому любой API ** должен ** удалить свойства, значение которых 'undefined'. –

+0

Я использую jQuery, и я не знаю, что он делает с объектом, но свойство остается там. – mcmlxxxvi

1

в первую очередь, тот javascript, а не JSON.

решение:

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

На самом деле это не ответ: * «без дополнительных statemets после определения» *. Очевидно, ОП знал, что он может это сделать. –

+0

@dystroy ваше право, то ответ: его невозможно – x4rf41

3

Вы могли бы сделать что-то вроде этого:

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

'null' не раздевается,' undefined' есть. – mcmlxxxvi

+0

Да, очень верно. Я просто вторил в своем коде, что было в оригинале. –

8

Вы можете это сделать, если вы определяете объект, используя анонимную функцию вместо объекта буквального обозначения:

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

Полученный data объект является точно такой же, за исключением того, что это constructor будет анонимную функцию вместо window.Object ,

0

староват, но есть хорошее решение, так что вы можете сделать:

data: { 
    userId: 7, 
    actionId: 36 
} 

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

Таким образом, он будет присвоить курьерскую свойство со значением вам нужно, если ваше условие ложно.

3

Используйте spread operator.

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

Обратите внимание, что если вы используете Flow, что синтаксис может генерировать ошибки проверки типа. Вы можете написать выше более явно, и менее лаконично, как:

data: { 
    userId: 7, 
    actionId: 36, 
    ...(myCondition ? {express: true} : {}) 
} 
Смежные вопросы