提问者:小点点

JavaScript-反向数组到位


我正在尝试编写代码,在不使用reverse函数的情况下反转一个数组(我正忙于学习JS,所以只是做一个来自雄辩的JavaScript的练习)。

  function reverseArrayInPlace(arr) {
   for (let i = 0; i < arr.length; i++) {
    arr[i] = arr[(arr.length - 1) - i];
  }

  return arr;
}

这是我编写的代码,但它不太有效,我知道这是因为我已经重新分配了arr[0]arr[1],所以如果我调用ReverseRayInPlace([1,2,3,4,5]),则返回[5,4,3,4,5]

这是作为解决办法给出的:

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

谁能解释一下解决方案中发生了什么,这样我就能更好地理解了? 谢谢:)


共3个答案

匿名用户

下面是这个函数中发生的事情:

用于(设i=0;i:

他们使用Math.flood()方法来确保您只遍历数组的一半。 这就是为什么您最初的解决方案重复了元素,而不是颠倒它们。

让旧=数组[i]:

这是一个临时变量,用于在交换元素时保存循环中当前索引处的元素。

array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = old;

这将交换元素。

只留下返回数组;

匿名用户

您只需要循环数组的一半,因为您正在交换项; 如果对整个数组进行循环,则会对每个项进行两次交换,而根本不改变数组。 在每个迭代中,您只需复制反射索引处的值,而不是调换这两个值,对于这两个值,您需要一个临时变量来存储其中一个值。

匿名用户

假设您有一个数组[1,2,3,4,5]。 代码从最左边的元素开始,然后与最右边的元素交换。 得到[5,2,3,4,1]。 然后它对数组中的下一个元素执行同样的操作,将它与右边第二个元素交换,得到[5,4,3,2,1]。 Math.flood(array.length)确保已经交换的元素不会再次交换,这样它将只遍历数组的前半部分。