2010-09-14 16 views
8

Gibt es eine süße Möglichkeit, ein Array zu initalisieren, wenn es nicht bereits initialisiert ist? Derzeit sieht der Code so etwas wie:Elegante Methode zum Initialisieren und Erweitern eines Javascript-Arrays

if (!obj) var obj = []; 
obj.push({}); 

kühl etwas wie var obj = (obj || []).push({}) sein würde, aber das funktioniert nicht :-(

+0

Um funktioniert ... Das ist eine seltsame Position für 'var obj' .. nach' if (! obj) ', macht nicht viel Sinn, ist' obj' auch in einem höheren Bereich oder etwas definiert? – gnarf

+0

Javascript initiert nicht einen zusätzlichen Bereich innerhalb von if/else – sod

+0

Ich weiß das, weshalb ich mich wundere, warum Sie jemals eine 'var' so definieren würden ... Ich nehme an,' obj' ist wahrscheinlich eine Funktion Parameter, und das Schlüsselwort 'var' in dort ist nur nutzlos/unerwünscht ... Wenn nicht, gibt es keine Möglichkeit, dass' obj' jemals vor diesem Aufruf definiert werden könnte. Probieren Sie 'obj = {}; (function() {if (! obj) var obj = []; console.log (obj);})(); '- Sie erhalten' [] ' – gnarf

Antwort

12

var obj = (obj || []).push({}) nicht, weil push gibt die neue Länge des Arrays funktioniert Für. ein neues Objekt, wird es obj mit Wert 1. bei einem bestehenden Objekt erstellen sie einen Fehler auslösen könnten - wenn obj eine Zahl ist, spielt es keine push Funktion hat

Sie sollten mit tun OK.

var obj = obj || []; 
obj.push({}); 
+1

Der düsterere Einstrich '(obj = obj || []) && obj.push ({}) && obj' könnte tun, wonach er sucht ... – gnarf

+0

@gnarf - Interessante Idee. Wenn ich richtig verstehe, sollte die Zeile immer noch mit 'var obj =' beginnen. – Kobi

2

Das Beste, was ich mir vorstellen kann ist:

var obj; 
(obj = (obj || [])).push({}); 
+0

außer implizit, 'obj' * sollte * in diesem Fall immer undefiniert sein, was das' (obj || []) 'nur' [] ' – gnarf

+0

Nein macht es nicht. 'var obj;' wird 'obj' nicht auf' undefiniert' setzen, wenn es vorher 'definiert' wurde. – RoToRa

+0

Es sei denn, Sie verwenden 'var obj' zweimal im selben Bereich, was für mich einfach eine Verschwendung der 'var' zu sein scheint ... – gnarf

0
with(obj = obj || []) push({}); 
+0

Ich denke, Ihre Vorbearbeitung war besser: '(obj || [{}]) 'ist funktional. – annakata

+0

-1: erk! niemals * jemals * die "mit" -Funktion von Javascript verwenden. – Spudley

+0

Ich fürchte, die 'mit' Aussage zu verwenden, wie Douglas Crockford mir sagte (http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/), dass schlechte unvorhergesehene Dinge bei seiner Verwendung passieren können – sod

0

Nur ein winziger zwicken Ihre Idee es

var obj = (obj || []).concat([{}]); 
+0

Obwohl 'concat' tatsächlich ein komplett neues Array zurückgibt ...Das heißt, wenn obj bereits definiert war (was ich noch immer neugierig bin), wird das '{}' in keinem übergeordneten Bereich hinzugefügt ... – gnarf

+0

Das stimmt, aber im Original gibt es keine Informationen zum Umfang Frage. Da er bei seinem Versuch eine Zuweisungsanweisung verwendet, ist Mutation natürlich keine Voraussetzung. –

+0

Sein Original scheint zu sagen: 'obj' sollte entweder so bleiben, wie es ist, oder ein leeres Array werden, dann" etwas "draufschieben ... Das Problem, dass' push' nicht auf dem ursprünglichen 'obj' passieren würde Wenn also "obj" eine Referenz auf ein anderes Array oder einen Funktionsparameter usw. wäre, würde Ihr Code nicht dasselbe tun ... – gnarf

Verwandte Themen