2009-06-18 7 views
68

Ich habe eine Anforderung, den ?? C# -Operator auf JavaScript anzuwenden, und ich weiß nicht wie. Betrachten Sie diese in C#:Ersetze einen Wert, wenn null oder undefined in JavaScript

int i?=null; 
int j=i ?? 10;//j is now 10 

Jetzt habe ich dies in JavaScript eingerichtet:

var options={ 
     filters:{ 
      firstName:'abc' 
     } 
    }; 
var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen 
var filter2=options.filters[1]||'';//should get empty string here, because there is only one filter 

Wie kann ich es richtig machen?

Danke.

EDIT: Ich habe die Hälfte des Problems entdeckt: Ich kann nicht die "Indexer" -Notation zu Objekten (my_object[0]) verwenden. Gibt es eine Möglichkeit, es zu umgehen? (Ich kenne die Namen der Filtereigenschaften vorher nicht und möchte sie nicht durchlaufen).

Antwort

163

Hier ist das Äquivalent JavaScript:

var i = null; 
var j = i || 10; //j is now 10 

Beachten Sie, dass die logical operator || nicht einen Booleschen Wert, sondern den ersten Wert zurückgibt, die wahr umgewandelt werden können.

verwenden, zusätzlich eine Reihe von Objekten statt einem einzelnen Objekt:

var options = { 
    filters: [ 
     { 
      name: 'firstName', 
      value: 'abc' 
     } 
    ] 
}; 
var filter = options.filters[0] || ''; // is {name:'firstName', value:'abc'} 
var filter2 = options.filters[1] || ''; // is '' 

, die durch einen Index zugegriffen werden kann.

+21

Beachten Sie, dass dies nicht funktioniert, wenn 0 ein gültiger Wert ist von i. – jt000

+4

Wenn irgendetwas falsch ist eine potentiell gültige Eingabe ('0',' false', leere Zeichenfolge), würde ich stattdessen so etwas tun: 'var j = (i === null)? 10: i; 'Das wird nur" null "ersetzen, anstatt alles, was als falsch bewertet werden kann. – DBS

+0

Gibt es dafür in Groovy ein Entsprechendes? – user6123723

6

Ich habe die Hälfte des Problems entdeckt: Ich kann die Indexer-Notation nicht für Objekte verwenden (my_object [0]). Gibt es eine Möglichkeit, es zu umgehen?

Nein; Ein Objektliteral ist, wie der Name andeutet, ein Objekt und kein Array, so dass Sie eine Eigenschaft nicht einfach anhand eines Index abrufen können, da es keine bestimmte Reihenfolge ihrer Eigenschaften gibt. Der einzige Weg, um ihre Werte zu erhalten ist durch den spezifischen Namen verwenden:

var someVar = options.filters.firstName; //Returns 'abc' 

oder durch Überlaufen der for ... in Schleife:

for(var p in options.filters) { 
    var someVar = options.filters[p]; //Returns the property being iterated 
} 
+0

Omg eine "for in" -Schleife in JS, danke, ha! – LinusGeffarth

Verwandte Themen