2013-08-02 13 views
22

Gibt es eine Syntax zum Festlegen von Eigenschaften basierend auf einer Bedingung?Bedingt eine Objekteigenschaft festlegen

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

Ich möchte express entweder auf einen Wert oder gar nicht gesetzt gesetzt werden (das heißt, sollte es keinen Schlüssel express genannt) und ohne zusätzliche Aussagen nach der Definition. Ich weiß, dass ich es als Boolean verwenden kann, aber die empfangende Seite verwendet einen isset() Scheck und ich frage mich, ob ich es vermeiden kann, es zu ändern.


bearbeiten: wie gesagt scheint es für das Problem keine direkte Lösung. Hier sind die Nähe Vorschläge:

JSON.stringify (Chris Kessel, dystroy):

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

Eine anonyme Funktion (Paulpro):

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

Eine zusätzliche Erklärung (x4rf41):

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

Eval (ein ehemaliger Kollege von mir):

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

bedingte Definition (weiß nicht wirklich, wie diese beschriften):

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

wenn Sie sagen, „nicht gesetzt“, meinen Sie die Eigenschaft vorhanden ist, aber den Wert 'undefined' hat, oder die Eigenschaft existiert nicht ? – jbabey

+0

Ich meine, das Eigentum sollte überhaupt nicht existieren. – mcmlxxxvi

+0

@mcmlxxxvi Ich denke, Sie meinten Objekteigenschaften, nicht JSON-Eigenschaften. Ihre Frage enthält kein JSON. – Paulpro

Antwort

21

es wie folgt tun:

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

Eine Eigenschaft, deren Wert undefined nicht geschrieben wenn Sie stringify das Objekt zu JSON.


EDIT: Es scheint aus den Kommentaren, dass es keine JSON in der Tat beteiligt ist. OP verwendet $.ajax, also $.param wird wahrscheinlich verwendet. $.param erstellt leider einen Eintrag für Eigenschaften, deren Wert undefined ist. Es gibt also wahrscheinlich keine Lösung ohne zusätzliche Codezeile.

+0

Ich liefere es nur an einen AJAX-Anruf und es ist nicht entfernt - ich bin nicht ausdrücklich string es ATM. – mcmlxxxvi

+0

Ich kenne Ihre API nicht, aber es ist fast sicher, dass sie JSON.stringify aufruft. Selbst wenn dies nicht der Fall ist, erlaubt die Norm keinen undefinierten Wert, so dass jede API ** Eigenschaften entfernen muss, deren Wert "undefiniert" ist. –

+0

Ich benutze jQuery, und ich weiß nicht, was es mit dem Objekt tut, aber die Eigenschaft bleibt dort. – mcmlxxxvi

1

aller ersten, das ist Javascript, nicht JSON.

die Lösung:

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

Dies ist nicht wirklich eine Antwort: * "ohne zusätzliche Statements nach der Definition" *. Offensichtlich wusste OP, dass er das tun konnte. –

+0

@dystroy dein Recht, dann ist die Antwort: seine impossible – x4rf41

3

Sie so etwas tun könnte:

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

'null' ist nicht abgestreift,' undefined' ist. – mcmlxxxvi

+0

Ja, sehr wahr. Ich habe nur in meinem Code wiedergegeben, was im Original war. –

8

Sie können es tun, wenn Sie Ihr Objekt mit Hilfe eines anonymen Funktion anstelle von Objektliteral Notation definieren:

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

Das resultierende data Objekt ist genau das gleiche, außer es constructor ist die anonyme Funktion anstelle von window.Object .

0

ein bisschen alt, aber es ist eine gute Lösung, wie gut können Sie tun:

data: { 
    userId: 7, 
    actionId: 36 
} 

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

So wird es Ihre ausdrückliche Eigenschaft mit dem Wert zuweisen Sie benötigen, wenn Sie Ihre Bedingung falsch ist.

3

Verwenden Sie die spread operator.

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

Beachten Sie, dass, wenn Sie Flow verwenden, dass Syntax könnte Typprüfung zu Fehlern. Sie können die oben mehr explizit schreiben, und weniger prägnant, wie:

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