2011-10-27 7 views
7

¿Cómo funciona exactamente el Javascript array.reverse()? ¿Pasa e intercambia cada elemento de la matriz? Si es así, ¿se necesita O (n) para intercambiar una matriz de tamaño n?Array de Javascript Reverso

supongo que la razón por la que estoy pidiendo es porque me preguntaba si array.reverse() fue el mismo que:

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: Lo siento si el código Javascript que he publicado es incorrecta, es muy tarde ahora.

EDIT: Corregido a.length a a.length/2.

+2

Es incorrecto porque al recorrer la matriz en su totalidad, intercambiará todos los elementos dos veces y volverá a la matriz original. Use 'a.length/2' (división entera de a.length y 2) – xanatos

Respuesta

6

Para obtener todos los detalles sobre cómo funciona, read the relevant section of the spec. Aquí está el algoritmo:

  1. Sea O el resultado de llamar toObject pasar el este valor como argumento.

    1. Deje que lenVal sea el resultado de llamar al método interno [[Get]] de O con argumento "length".
    2. Let len ​​be Toint32 (lenVal).
    3. Deje que el medio sea piso (len/2).
    4. Letlower ser 0.
    5. de repetición, mientras que inferior ≠ medio

      1. Deje superior se len-inferior -1.
      2. Deje que upperP sea ToString (superior).
      3. Dejar que lowP sea ToString (inferior).
      4. Sea lowValue el resultado de llamar al método interno [[Get]] de O con el argumento lowerP.
      5. Deje que upperValue sea el resultado de llamar al método interno [[Get]] de O con el argumento upperP.
      6. Deje que lowerExists sea el resultado de llamar al método interno [[HasProperty]] de O con el argumento lowerP.
      7. Deje que upperExists sea el resultado de llamar al método interno [[HasProperty]] de O con el argumento upperP.
      8. Si lowerExists es verdadera y upperExists es cierto, entonces

      9. Call el [[Pon]] método interno de O con argumentos lowerP, upperValue, y verdadero.

      10. Llame al método interno [[Put]] de O con los argumentos upperP, lowerValue y true.
      11. Else si lowerExists es falso y upperExists es verdadero, entonces
      12. Llame al método interno [[Put]] de O con argumentos lowP, upperValue y true.
      13. Llamar al método interno [[Eliminar]] de O, con argumentos upperP y verdadero.
      14. Else si lowerExists es verdadero y upperExists es falso, entonces
      15. Llame al método interno [[Delete]] de O, con los argumentos lowP y true.
      16. Llame al método interno [[Put]] de O con argumentos upperP, lowerValue y true.
      17. De lo contrario, bothExists y upperExists son falsos
      18. No se requiere ninguna acción.
      19. Aumentar inferior por 1.
    6. Return O.
2

El algoritmo real es casi similar a lo que ha especificado. Simplemente cambie su ciclo for para iterar solo hasta a.length/2 y sería similar a lo que Array.reverse haría. Me estoy saltando los detalles internos aquí en aras de la simplicidad. Entonces sería

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; 
}