2010-09-14 2 views
8

Y a-t-il un moyen doux d'initier un tableau s'il n'est pas déjà initilisé? Actuellement le code ressemble à quelque chose comme:Manière élégante d'initialiser et d'étendre un tableau javascript

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

frais serait quelque chose comme var obj = (obj || []).push({}), mais cela ne fonctionne pas :-(

+0

Um ... Thats une position bizarre pour 'var obj' .. après' if (! obj) ', n'a pas beaucoup de sens,' obj' est-il aussi défini dans une portée plus élevée ou quelque chose? – gnarf

+0

javascript n'init pas une portée supplémentaire à l'intérieur if/else – sod

+0

Je sais cela, c'est pourquoi je me demande pourquoi vous définissez jamais de façon conditionnelle un 'var' comme ça ... Je suppose que' obj' est probablement une fonction paramètre, et le mot-clé 'var' est juste inutile/indésirable ... Sinon, il n'y a aucun moyen de définir' obj' avant cet appel ... Essayez 'obj = {}; (function() {if (! obj) var obj = []; console.log (obj);})(); '- Vous obtiendrez []' – gnarf

Répondre

12

var obj = (obj || []).push({}) ne fonctionne pas parce que push renvoie la nouvelle longueur du tableau Pour. un nouvel objet, il va créer obj avec une valeur de 1. Pour un objet existant, il pourrait soulever une erreur - si obj est un nombre, il ne dispose pas d'un

fonction push

que vous devez faire avec OK.

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

Le sillier one-liner '(obj = obj || []) && obj.push ({}) && obj' pourrait faire ce qu'il cherche ... – gnarf

+0

@gnarf - Idée intéressante. Si je comprends bien, la ligne devrait toujours commencer par 'var obj ='. – Kobi

2

Le mieux que je peux penser est:

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

sauf implicitement, 'obj' * should * toujours être indéfini dans ce cas, ce qui rend le' (obj || []) 'juste' [] ' – gnarf

+0

Non ce ne sera pas. 'var obj;' ne mettra pas 'obj' à' undefined' s'il a été 'defined' avant. – RoToRa

+0

Sauf si vous utilisez 'var obj' deux fois dans la même portée, ce qui me semble être une perte de' var' ... – gnarf

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

Je pense que votre pré-édition était supérieure: '(obj || [{}]) 'est fonctionnel. – annakata

+0

-1: erk! jamais * jamais * utiliser la fonction "avec" de Javascript. – Spudley

+0

Je crains d'utiliser la déclaration 'with' comme Douglas Crockford m'a dit (http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/) que de mauvaises choses imprévues peuvent se produire sur son utilisation – sod

0

Juste un petit coup sec à votre idée de le faire fonctionner

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

Cependant, 'concat' renvoie un tableau complètement nouveau ...Ce qui signifie que si obj était déjà défini (et je suis toujours curieux de savoir comment cela pourrait se produire), il ne sera pas ajouté {{} 'dans toute portée parent ... – gnarf

+0

C'est vrai, mais il n'y a pas d'informations de portée dans l'original question. En outre, puisqu'il utilise une déclaration d'affectation dans sa tentative, la mutation n'est clairement pas une exigence. –

+0

Son original semble indiquer: 'obj' devrait soit rester tel quel, soit devenir un tableau vide, puis' pousser 'quelque chose dessus ... Le problème étant que 'push' ne se produirait pas sur le' obj' d'origine donc si ce 'obj' était une référence à un tableau différent, ou un paramètre de fonction, etc ... votre code ne ferait pas la même chose ... – gnarf

Questions connexes