reverseArrayInPlace eloquentJS

时间:2016-01-17 23:18:09

标签: javascript

我想出了一个解决这个问题的简单方法,并且确定了。

var reverseArrayInPlace = function(arr) {
  var result = [];
  for(var i = 0; i < arr.length; i++) {
    result.unshift(arr[i]);
  }
  for(var j = 0; j < result.length; j ++) {
    arr[j] = result[j];
  }
};
//test
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
//[5,4,3,2,1]

但是,我想知道为什么我不能使用更简单的方法只需将arr参数赋给结果值[5,4,3,2,1] ?但是下面的代码不起作用,它仍打印出[1,2,3,4,5]

var reverseArrayInPlace = function(arr) {
  var result = [];
  for(var i = 0; i < arr.length; i++) {
    result.unshift(arr[i]);
  }
  arr = result;
};
//test
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
//[1,2,3,4,5]

2 个答案:

答案 0 :(得分:1)

在你的开发者控制台中试试这个:

var arr = [1,2,3];

function retArr(arr){
    var res = arr;
    res = [3,2,1];
    return res;
}
retArr(arr); // returns 3,2,1
console.log(arr); // logs 1,2,3

你所做的只是创造一个新阵列! 函数的参数是按值传递的。 直接for循环访问的原因是因为数组属性是传递引用。

P.S。实际的就地逆转看起来像这样:

function reverseInPlace(array){
    var swap = function(i,j){
        var t = array[i];
        array[i] = array[j];
        array[j] = t;
    };
    for (var i = 0; i < array.length/2;i++){
        swap(i,array.length-i-1);
    }
}

答案 1 :(得分:1)

尝试使用.slice().pop()

&#13;
&#13;
var reverseArrayInPlace = function(arr) {
  var copy = arr.slice(0);
  for (var n = 0; n < arr.length; n++) {
    arr[n] = copy.pop();
  }
  return arr
};
//test
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
&#13;
&#13;
&#13;

或者,使用Array.prototype.sort()

&#13;
&#13;
var reverseArrayInPlace = function(arr) {
  arr.sort(function(a, b, index) {
    return index < index + 1 ? -1 : 1
  });
};
//test
var arrayValue = ["a", "b", "c", "d", "e"];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
&#13;
&#13;
&#13;