2013-08-02 6 views
22

조건에 따라 속성을 설정하는 구문이 있습니까? 조건부로 개체 속성을 설정하십시오.

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; 
012 3,516,

평가 (나의 전 동료) : 그게 모두의

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

, 당신은 속성이 존재하지만 값을 가지고 의미합니까 'undefined', 또는 속성이 존재하지 않습니다 ? – jbabey

+0

나는 재산이 전혀 존재하지 않아야 함을 의미합니다. – mcmlxxxvi

+0

@mcmlxxxvi JSON 속성이 아니라 객체 속성을 의미한다고 생각합니다. 귀하의 질문에 JSON이 없습니다. – Paulpro

답변

21

이처럼 수행 값이입니다 undefined 기록되지 않습니다

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

프로퍼티 때 stringify JSON에 개체.


편집 : 실제로 JSON이 관련되어 있지 않은 것으로 보입니다. OP는 $.ajax을 사용하므로 $.param이 아마도 사용됩니다. $.param, 불행히도 값이 undefined 인 속성에 대한 항목을 만듭니다. 보완적인 코드 라인이 없다면 아마도 해결책이 없을 것입니다.이 constructor는 익명 함수를 수 대신 window.Object 것입니다 제외하고,

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

결과 data 객체가 동일한입니다 : 대신 객체 리터럴 표기법의 익명 함수를 사용하여 객체를 정의하는 경우

+0

난 그냥 AJAX 호출에 제공하고 멀리 벗겨 지진 않아 - 분명히 ATM 그것을 stringify 아니에요. – mcmlxxxvi

+0

API를 모르지만 JSON.stringify를 호출하고 있다고 확신합니다. 그렇지 않은 경우에도 표준은 정의되지 않은 값을 전달할 수 없으므로 모든 API는 값이 '정의되지 않음'인 속성을 제거해야합니다 **. –

+0

jQuery를 사용하고 있는데 객체로 어떤 작업을 수행했는지 알 수는 없지만 속성은 그대로 남아 있습니다. – mcmlxxxvi

1

먼저 :

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

조건부 정의는 (정말이 하나의 레이블을하는 방법을 모른다) 자바 스크립트가 아니라 JSON.

솔루션 :

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

이것은 실제로 대답이 아닙니다. * "정의 뒤에 여분의 statemets이없는 경우"*. OP는 그가 그것을 할 수 있음을 알고있었습니다. –

+0

@dystroy 당신의 권리, 그 대답은 다음과 같습니다. 그것의 불가능한 – x4rf41

3

당신은 이런 식으로 뭔가를 할 수 :

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

'null'은 제거되지 않았고,'undefined'가 있습니다. – mcmlxxxvi

+0

네, 사실입니다. 원래 코드에 내 코드가 그대로 표시되었습니다. –

8

당신은 그것을 할 수 있습니다 .

0

A는 오래된 비트하지만,뿐만 아니라 당신이 할 수있는 좋은 해결책이있다 :

data: { 
    userId: 7, 
    actionId: 36 
} 

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

은 따라서 귀하의 조건이 거짓 인 경우 당신이 필요로하는 값으로 명시 적 속성을 할당합니다은.

3

spread operator을 사용하십시오. 당신이 Flow를 사용하는 경우, 그 구문 유형 검사 오류가 발생할 수 있음을

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

참고. 좀 더 명시 적으로 위를 쓸 수, 덜 간결하게, 같이

당신이 "전혀 설정하지"말
data: { 
    userId: 7, 
    actionId: 36, 
    ...(myCondition ? {express: true} : {}) 
} 
관련 문제