2012-07-30 14 views
5

So che in JavaScript a volte il sistema crea un array falso, il che significa che in realtà è un oggetto e non un'istanza di Array, ma ha ancora parte delle funzionalità di un array. Ad esempio, la variabile argomenti che si ottiene all'interno delle funzioni è una matrice fittizia creata dal sistema. In questo caso so che di trasformarlo in un vero e proprio schieramento che si può fare:Trasforma un array falso creato da me in un vero array in JavaScript

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

Ma cosa succede se la matrice falso non è stato creato dal sistema, che cosa se fakeArray era semplicemente:

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

In questo caso, e l'ho provato, l'utilizzo del metodo sopra comporterà una matrice vuota. La cosa che voglio essere in grado di trasformare un array falso come nell'esempio che ho dato (creato da me e non dal sistema) in un vero array. E prima che tu mi dica semplicemente di rendere il finto array un vero array fin dall'inizio, dovresti sapere che ottengo il falso array da una risorsa di cui non ho il controllo.

Quindi, come posso trasformare un array di falsi non creato dal sistema in un array reale?

+1

Hai provato ad aggiungere una proprietà 'length' all'oggetto? Credo che quasi tutte le modifiche di "Array. *" Utilizzino la lunghezza dell'array. – Zeta

+2

@Elias Van Ootegem Ovviamente non hai letto tutta la mia domanda. – Cokegod

+0

@EliasVanOotegem Perché non leggere la domanda prima di fare domande a cui viene data una risposta? –

risposta

5

L'esempio funzionerà se alla "matrice di falsi" viene assegnata una proprietà .length impostata in modo appropriato.

Questo non funzionerà con alcune versioni precedenti di Internet Explorer.


"uno degli scopi di trasformare la matrice falso in un array reale è quello di ottenere la sua lunghezza"

Se si desidera che il numero di proprietà in oggetto, utilizzare Object.keys ...

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

per shim Object.keys per browser meno recenti, si può fare questo ...

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

Se l'Array falso è "sparse", avrete bisogno di una soluzione come @Rocket mostra.

+0

Cool, questo funziona. Neat! :-) –

+0

Non funzionerà nelle versioni precedenti di IE, se l'array falso è un oggetto host come nodelist (* "Array.prototype.slice: 'questo' non è un oggetto JavaScript" *) – Esailija

+0

Grazie, anche se io non mi piace davvero creare fall-back inefficienti per i vecchi browser, ma suppongo che tu debba farlo ... – Cokegod

3

Si può semplicemente passare in rassegna l'array e salvare i valori in un array reale.

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

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

mi hai battuto al minuto;) +1 – rsplak

+1

@rsplak: Le grandi menti pensano allo stesso modo. –

+1

+1 Penso che questo sarà meglio nel complesso dal momento che il '.length' non è noto. –

0

È possibile scorrere le proprietà degli oggetti, mentre si spinge quelli che si desidera per il vostro nuovo array:

var array = []; 

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