2011-10-27 32 views
7

Javascript的array.reverse()的工作原理是什麼?它是否通過並交換陣列的每個元素?如果是這樣,是否需要O(n)交換大小爲n的數組?Javascript的數組反轉

我想我問的原因是因爲我在想,如果array.reverse()是一樣的:

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

注意:很抱歉,如果Javascript代碼我張貼不正確,這是相當晚了現在。

編輯:固定a.lengtha.length/2

+2

這是不正確的,因爲通過完整地遍歷數組,您將交換所有元素兩次並返回到原始數組。使用'a.length/2'(a.length和2的整數除法) – xanatos

回答

6

關於它是如何工作的全部細節,read the relevant section of the spec。這裏的算法:

  1. 令O是調用ToObject傳遞這個值作爲參數的結果。

    1. 讓lenVal成爲調用參數「length」的O的[[Get]]內部方法的結果。
    2. 讓len成爲ToUint32(lenVal)。
    3. 讓中間爲底(len/2)。
    4. Letlower爲0
    5. 重複,而較低的中間≠

      1. 讓上部爲len - 低級-1。
      2. 設upperP爲ToString(上)。
      3. 設lowerP爲ToString(下)。
      4. 讓lowerValue成爲用參數lowerP調用O的[[Get]]內部方法的結果。
      5. 讓upperValue成爲用參數upperP調用O的[[Get]]內部方法的結果。
      6. 讓lowerExists是使用參數lowerP調用O的[[HasProperty]]內部方法的結果。
      7. 讓upperExists是使用參數upperP調用O的[[HasProperty]]內部方法的結果。
      8. 如果lowerExists是真實和upperExists爲真,則

      9. 調用[[把]] O的帶有參數lowerP,upperValue,和真正的內部方法。

      10. 用參數upperP,lowerValue和true調用O的[[Put]]內部方法。
      11. 否則,如果lowerExists爲false並且upperExists爲true,則
      12. 用參數lowerP,upperValue和true調用O的[[Put]]內部方法。
      13. 用參數upperP和true調用O的[[Delete]]內部方法。
      14. 否則,如果lowerExists爲true並且upperExists爲false,則
      15. 調用O的[[Delete]]內部方法,參數lowerP和true。
      16. 用參數upperP,lowerValue和true調用O的[[Put]]內部方法。
      17. 否則,lowerExists和upperExists均爲虛假
      18. 不需要任何操作。
      19. 增加減1.
    6. 返回O。
2

實際的算法幾乎是相似的,你指定什麼。只需將您的for循環更改爲只迭代到a.length/2,它將與Array.reverse所做的相似。爲簡單起見,我在此跳過內部細節。所以它會是

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