2010-09-14 16 views
8

¿Existe alguna manera de iniciar una matriz si no está ya iniciada? Actualmente el código se ve algo como:Manera elegante de iniciar y extender una matriz de javascript

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

fresco sería algo así como var obj = (obj || []).push({}), pero eso no funciona :-(

+0

Um ... Esa es una posición extraña para 'var obj' .. después de' if (! obj) ', no tiene mucho sentido, ¿' obj' también se define en un ámbito superior o algo así? – gnarf

+0

JavaScript no inicia un alcance extra dentro de if/else – sod

+0

Lo sé, por lo que me pregunto por qué alguna vez definirías condicionalmente una 'var' así ... supongo que' obj' es probablemente una función parámetro, y la palabra clave 'var' allí es inútil/no deseada ... Si no, no hay forma de que 'obj' pueda definirse antes de esta llamada ... Prueba' obj = {}; (function() {if (! obj) var obj = []; console.log (obj);})(); '- Obtendrá' [] ' – gnarf

Respuesta

12

var obj = (obj || []).push({}) no funciona porque push devuelve la nueva longitud de la matriz A. un nuevo objeto, se creará obj con valor de 1. Para un objeto existente que podría plantear un error - si obj es un número, que no tiene una función push

que debe hacer bien con:.

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

The sillier one-liner '(obj = obj || []) && obj.push ({}) && obj' podría hacer lo que está buscando ... – gnarf

+0

@gnarf - Interesting idea. Si entiendo correctamente, la línea aún debería comenzar con 'var obj ='. – Kobi

2

Lo mejor que puedo pensar es:

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

excepto implícitamente, 'obj' * should * siempre debe estar indefinido en este caso, lo que hace que' (obj || []) 'just' [] ' – gnarf

+0

No, no lo hará. 'var obj;' no establecerá 'obj' en' undefined' si fue 'defined' antes. – RoToRa

+0

A menos que esté usando 'var obj' dos veces en el mismo ámbito, lo cual me parece una pérdida de' var' ... – gnarf

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

Creo que su edición previa fue superior: '(obj || [{}]) 'es funcional. – annakata

+0

-1: ¡erk! nunca * nunca * usó la función "con" de Javascript. – Spudley

+0

Me temo utilizar la declaración 'con ', ya que Douglas Crockford me dijo (http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/) que pueden suceder cosas malas imprevistas en su uso – sod

0

Sólo un pequeño pellizco a su idea de hacer que funcione

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

Aunque, 'concat' en realidad devuelve una matriz completamente nueva ...Es decir, si obj ya estaba definido (que todavía tengo curiosidad por saber cómo podría suceder), no tendrá agregado el '{}' en ningún ámbito principal ... – gnarf

+0

Eso es cierto, pero no hay información sobre el alcance en el original pregunta. Además, dado que está usando una declaración de asignación en su intento, la mutación claramente no es un requisito. –

+0

Su original parece indicar: 'obj' debe permanecer tal como está, o convertirse en una matriz vacía, y luego 'presionar' algo sobre ella ... El problema es que' push' no ocurriría en el 'obj' original entonces si ese 'obj' era una referencia a una matriz diferente, o un parámetro de función, etc. ... su código no haría lo mismo ... – gnarf

Cuestiones relacionadas