2012-07-30 15 views
5

Sé que en JavaScript a veces el sistema crea una matriz falsa, lo que significa que es realmente un objeto y no una instancia de Array, pero aún tiene parte de la funcionalidad de una matriz. Por ejemplo, la variable de argumentos que obtienes dentro de las funciones es una matriz falsa creada por el sistema. En este caso sé que para convertirlo en una matriz real de que puede hacer:Convertir una matriz falsa creada por mí en una matriz real en JavaScript

var realArray = Array.prototype.slice.call(fakeArray); 

Pero lo que si la matriz falsa no fue creado por el sistema, lo que si fakeArray fue simplemente:

var fakeArray = { "0": "some value", "1": "another value" }; 

En este caso, y lo probé, el uso del método anterior dará como resultado una matriz vacía. Lo que quiero es convertir una matriz falsa como en el ejemplo que di (creado por mí y no por el sistema) en una matriz real. Y antes de decirme que simplemente haga de la matriz falsa una matriz real desde el principio, debe saber que obtengo la matriz falsa de un recurso del que no tengo control.

Entonces, ¿cómo puedo convertir una matriz falsa no creada por el sistema en una matriz real?

+1

¿Ha intentado añadir un 'propiedad length' al objeto? Creo que casi todas las modificaciones 'Array. *' Usan la longitud de la matriz. – Zeta

+2

@Elias Van Ootegem Obviamente no leyó toda mi pregunta. – Cokegod

+0

@EliasVanOotegem ¿Por qué no lees la pregunta antes de preguntar las cosas que se responden en ella? –

Respuesta

5

Su ejemplo funcionará si su "matriz falsa" recibe una propiedad .length configurada adecuadamente.

Esto no funcionará en algunas versiones anteriores de Internet Explorer.


"uno de los propósitos de convertir la matriz falsa en una matriz real es conseguir su longitud"

Si desea que el número de propiedades en el objeto, utilice Object.keys ...

var len = Object.keys(fakeArray).length; 

calzar Object.keys para exploradores más antiguos, se puede hacer esto ...

if (!Object.keys) { 
    Object.keys = function(o) { 
     var keys = []; 
     for (var k in o) 
      if (o.hasOwnProperty(k)) 
       keys.push(k) 
     return keys; 
    }; 
} 

Si la matriz es falsa "escasa", necesitará una solución como @Rocket muestra.

+0

Genial, eso sí funciona. ¡Ordenado! :-) –

+0

No funcionará en versiones anteriores de IE, si la matriz falsa es un objeto host como nodelist (* "Array.prototype.slice: 'esto' no es un objeto JavaScript" *) – Esailija

+0

Gracias, aunque yo realmente no me gusta crear retrocesos ineficientes para navegadores antiguos, pero supongo que tienes que hacer eso ... – Cokegod

3

Simplemente puede recorrer el "conjunto" y guardar los valores en una matriz real.

var fakeArray = { "0": "some value", "1": "another value" }; 
var realArray = []; 

for(var i in fakeArray){ 
    realArray[i] = fakeArray[i]; 
} 
+0

me ganaste al minuto;) +1 – rsplak

+1

@rsplak: Las mentes geniales piensan igual. –

+1

+1 Creo que esto será mejor en general ya que se desconoce '.length'. –

0

Se puede recorrer las propiedades del objeto, mientras empuja las que desee a su nueva matriz:

var array = []; 

for (var i in fakeArray) if (fakeArray.hasOwnProperty(i)) { 
    array.push(fakeArray[i]); 
} 
Cuestiones relacionadas