手动反转数组

Reversing an array manually

我正在学习 JS 并坚持这个东西。我需要使用将参数作为值的函数来反转数组。像这样:

value = [1, 2, 3, 4, 5];
reverse(value);
console.log(value);
//[5, 4, 3, 2, 1]

我写了这个函数,不明白为什么它不起作用:

function reverseArrayInPlace(x){
  var p = 0, y = x;
  for(i = y.length-1; i>=0; i--){
    x[p] = y[i];
    p++;
    }
  return x;
  }

返回的是:[5, 4, 3, 4, 5] 也许我在这里做了一些愚蠢的事情,但你仍然能指出我错在哪里吗? 谢谢!

当您写 y=x 时,您也在修改原始数组,因为它们是通过引用复制的。

改为这样做:

function reverseArrayInPlace(x) {
  var p = 0, y = [];
  for (i = x.length - 1; i >= 0; i--) {
    y[p] = x[i];
    p++;
  }
  return y;
}

console.log(reverseArrayInPlace([1, 2, 3, 4, 5]))

这一行:

var p = 0, y = x;

正在将对存储在 x 中的数组的引用存储到变量 y 中。换句话说,xy 指向 同一个数组

要解决此问题,请构建一个新数组:

function reverseArrayInPlace(x) {
    var p = 0, y = [];

    for (i = x.length-1; i>=0; i--) {
        y[p] = x[i];
        p++;
    }
    return y;
}

如果确实需要修改原数组,只需将反转后的数组复制回原数组即可:

function reverseArrayInPlace(x) {
    var p = 0, y = [];

    for (i = x.length-1; i>=0; i--) {
        y[p] = x[i];
        p++;
    }

    for (var i = 0; i < y.length; i++) {
        x[i] = y[i];
    }

    return x;
}

你可以循环直到修改数组的中间。并简单地交换元素

function reverseArrayInPlace(x) {
  for (var i = 0, last = x.length - 1, mid = last/2, tmp; i <= mid; i++) {
    tmp = x[i];
    x[i] = x[last - i];
    x[last - i] = tmp;
    
  }
  return x;
}

const arr = [1,2,3,4,5]

reverseArrayInPlace(arr)

console.log(JSON.stringify(arr))
const arr2 = [1, 2, 3, 4, 5, 6]

reverseArrayInPlace(arr2)

console.log(JSON.stringify(arr2))

实际上您正在覆盖原始数组,因此您需要将数组克隆到临时变量,然后重新分配值

value = [1, 2, 3, 4, 5];

但是你可以直接用这个函数来做

console.log(value.reverse());

Try this this will replace original array as per your requirement:

value = [1, 2, 3, 4, 5];
value = value.reverse();
console.log(value);

或者您可以这样做:

value = [1, 2, 3, 4, 5];
reverse(value);
console.log(value);

function reverse(x) {
  var p = 0, y = [];
  for (i = x.length - 1; i >= 0; i--) {
    y[p] = x[i];
    p++;
  }
  value = y;
}