2011-10-27 10 views
7

Come funziona esattamente lo array.reverse() di Javascript? Attraversa e scambia ogni elemento dell'array? In tal caso, è necessario O (n) per scambiare una matrice di dimensione n?Array di Javascript Reverse

Credo che la ragione per cui mi chiedo è perché mi chiedevo se array.reverse() era lo stesso:

for(var i = 0; i < a.length/2; i++) { 
    var holder = a[i]; 
    a[i] = a[a.length - 1 - i]; 
    a[a.length - 1 - i] = holder; 
} 

NOTA: Scusate se il codice Javascript che ho postato non è corretta, è piuttosto tardi al momento.

EDIT: risolto a.length a a.length/2.

+2

Non è corretto perché attraversando l'array per intero, scambierete tutti gli elementi due volte e tornerete all'array originale. Usa 'a.length/2' (divisione intera di a.length e 2) – xanatos

risposta

6

Per tutti i dettagli di come funziona, read the relevant section of the spec. Ecco l'algoritmo:

  1. Sia O essere il risultato della chiamata ToObject passando il questo valore come argomento.

    1. Lasciare lenVal essere il risultato di chiamare il metodo interno [[Ottieni]] di O con argomento "lunghezza".
    2. Sia len ToUint32 (lenVal).
    3. Lascia medio piano (len/2).
    4. Letlower essere 0.
    5. Repeat, mentre più in mezzo ≠

      1. Let superiore essere len-inferiore -1.
      2. Lascia che upperP sia ToString (superiore).
      3. Sia inferioreP sia ToString (inferiore).
      4. Sia LowerValue il risultato di chiamare il metodo interno [[Get]] di O con argomento lowerP.
      5. Consentire che upperValue sia il risultato di chiamare il metodo interno [[Get]] di O con argomento upperP.
      6. Lasciare che LowerExists sia il risultato del richiamo del metodo interno [[HasProperty]] di O con argomento lowerP.
      7. Lascia che upperExists sia il risultato di chiamare il metodo interno [[HasProperty]] di O con argomento upperP.
      8. Se lowerExists è vero e upperExists è vero, allora

      9. chiamata la [[Inserire]] metodo interno di O con argomenti lowerP, upperValue, e vero.

      10. Chiamare il metodo [[Put]] interno di O con argomenti upperP, lowerValue e true.
      11. Altrimenti se lowerExists è false e upperExists è true, quindi
      12. Chiamare il metodo [[Put]] interno di O con argomenti lowerP, upperValue e true.
      13. Chiamare il metodo interno [[Cancella]] di O, con argomenti upperP e true.
      14. Altrimenti se lowerExists è true e upperExists è false, quindi
      15. Chiamare il metodo interno [[Cancella]] di O, con argomenti lowerP e true.
      16. Chiamare il metodo [[Put]] interno di O con argomenti upperP, lowerValue e true.
      17. Altrimenti, sia LowerExists che upperExists sono false
      18. Non è richiesta alcuna azione.
      19. Aumento inferiore di 1.
    6. Return O.
2

L'algoritmo attuale è quasi simile a quello che si è specificato. Basta cambiare il tuo ciclo for per iterare solo fino a a.length/2 e sarebbe simile a quello che farebbe Array.reverse. Sto saltando i dettagli interni qui per motivi di semplicità. Quindi sarebbe

for(var i = 0; i < a.length/2; i++) { 
    var holder = a[i]; 
    a[i] = a[a.length - 1 - i]; 
    a[a.length - 1 - i] = holder; 
}