Javascript数组反向

时间:2011-10-27 07:08:26

标签: javascript arrays

Javascript的array.reverse()究竟是如何运作的?它是否通过并交换数组的每个元素?如果是这样,是否需要O(n)来交换大小为n的数组?

我想我问的原因是因为我想知道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.length修正为a.length / 2

2 个答案:

答案 0 :(得分:6)

有关其工作原理的详细信息,请read the relevant section of the spec。这是算法:

  
      
  1. 设O是调用ToObject传递此值作为参数的结果。

         
        
    1. 让lenVal成为使用参数“length”调用O的[[Get]]内部方法的结果。
    2.   
    3. 设len为ToUint32(lenVal)。
    4.   
    5. 让中间成为楼层(len / 2)。
    6.   
    7. Letlower为0。
    8.   
    9. 重复,而低≠中间

           
          
      1. 让上限为len-lower -1。
      2.   
      3. 让upperP为ToString(上)。
      4.   
      5. 让lowerP为ToString(更低)。
      6.   
      7. 让lowerValue成为使用参数lowerP调用O的[[Get]]内部方法的结果。
      8.   
      9. 让upperValue成为使用参数upperP调用O的[[Get]]内部方法的结果。
      10.   
      11. 让lowerExists成为使用参数lowerP调用O的[[HasProperty]]内部方法的结果。
      12.   
      13. 让upperExists成为使用参数upperP调用O的[[HasProperty]]内部方法的结果。
      14.   
      15. 如果lowerExists为true且upperExists为true,则

      16.   
      17. 使用参数lowerP,upperValue和true调用O的[[Put]]内部方法。

      18.   
      19. 使用参数upperP,lowerValue和true调用O的[[Put]]内部方法。
      20.   
      21. 否则如果lowerExists为false且upperExists为true,则
      22.   
      23. 使用参数lowerP,upperValue和true调用O的[[Put]]内部方法。
      24.   
      25. 调用O的[[Delete]]内部方法,参数upperP和true。
      26.   
      27. 否则,如果lowerExists为true且upperExists为false,则
      28.   
      29. 调用O的[[Delete]]内部方法,参数lowerP和true。
      30.   
      31. 使用参数upperP,lowerValue和true调用O的[[Put]]内部方法。
      32.   
      33. 否则,lowerExists和upperExists都是假的
      34.   
      35. 无需采取任何措施。
      36.   
      37. 将低点提高1。
      38.   
    10.   
    11. 返回O。
    12.   
  2.   

答案 1 :(得分: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;
}