(EloquentJavascript:第4章)反转数组 - 我的版本有什么问题吗?

时间:2014-10-17 06:14:24

标签: javascript arrays

这是我在试图解决书中“逆转阵列”练习时所得到的。它与答案列表中的内容不同,所以我想知道我的版本是否有问题?

  function revInPlace(array){
    var tempArr = [];
    for (i=array.length; i>0; i--){
      tempArr.push(array.pop());
    }
    array = tempArr;
    return array;
  }

  var range = [1,2,3,4,5,6,7,8,9,10];

  console.log(revInPlace(range));

  --> [10,9,8,7,6,5,4,3,2,1]

书中给出的答案是这个(我也不明白这是如何工作的,所以有人也可以向我解释这个代码plox吗?):

  function reverseArrayInPlace(array) {
    for (var i = 0; i < Math.floor(array.length / 2); i++) {
      var old = array[i];
      array[i] = array[array.length - 1 - i];
      array[array.length - 1 - i] = old;
    }
    return array;
  }

2 个答案:

答案 0 :(得分:0)

从技术上讲,你的版本并没有实际反转阵列。您创建了一个新的数组tempArr,以便在您的情况下:

reversed = revInPlace(arr);
console.log(arr); // returns empty original array after popping all elements off
console.log(reversed === arr);  // returns false;

虽然您的版本执行相反的操作,但由于创建了一个新数组,弹出和推送值,它会慢得多。

答案 1 :(得分:0)

由于您需要创建另一个数组,因此您没有“就地”执行相同的反转...

虽然书中的代码可以做到这一点,但它通过在数组的前半部分和结束部分之间切换(就地)来实现,只需尝试使用0和1的循环,假设有5个元素的数组: / p>

// array = [ 1, 2, 3, 4, 5 ] ... i = 0
var old = array[i]; // array[0] is 1
array[i] = array[array.length - 1 - i]; // array[0] = array[4] which is 5
array[array.length - 1 - i] = old; // array[4] = 1


// array = [ 1, 2, 3, 4, 5 ] ... i = 1
var old = array[i]; // array[1] is 2
array[i] = array[array.length - 1 - i]; // array[1] = array[3] which is 4
array[array.length - 1 - i] = old; // array[3] = 2

长度为5的循环将在此处结束,因为Math.floor(5 / 2)为2,因为您基本上完成了整个数组