反向数组,并返回相同的数组

时间:2016-10-30 14:47:36

标签: javascript arrays iteration

我必须编写一个反转数组的函数(我知道反向方法,但这次我必须编写一个函数)。此函数必须将数组变量作为输入并返回SAME变量,但具有相反的元素顺序。我无法理解的是这段代码的工作原理:



function reverseArrayInPlace(array) {
  for (i = array.length; i > 0; i--) {
    array.shift(array.push(i));
  }
  return array;
};




这段代码没有



function reverseArrayInPlace(array) {
  for (i = array.length; i > 0; i--) {
    array.unshift(array.pop(i));
  }
  return array;
};




虽然他们做的事情完全一样吗?

1 个答案:

答案 0 :(得分:0)

在您的代码的第二个版本

首先,请注意pop方法不带参数,因此传递 i 没有其他影响。

然后举一个你可能传递给这个函数的数组的例子:

 ['a', 'b', 'c', 'd']

在每次迭代中,您弹出数组中的最后一个元素,并使用此语句将其移回前面(我删除了 i ):

 array.unshift(array.pop());

这是循环的4次迭代中发生的事情:

 ['d', 'a', 'b', 'c']
 ['c', 'd', 'a', 'b']
 ['b', 'd', 'a', 'b']
 ['a', 'b', 'c', 'd']

...和你开始时使用相同阵列的背部。

在您的代码的第一个版本

请注意,shiftpush似乎排列错误,无论如何都有用。此外,push将参数作为要在数组末尾添加的值,但是您传递的是索引,而不是数组中的值:

array.shift(array.push(i));

然后,移位取出第一个元素,其值为......丢失。

这就是迭代中发生的事情:

['b', 'c', 'd', 4]
['c', 'd', 4, 3]
['d', 4, 3, 2]
[4, 3, 2, 1]

所以,这也不会反转你的数组(只有你碰巧传递它[1, 2, 3, 4],但正如你所看到的那样纯粹是偶然的)。

如果你像这样交换了shiftpush

array.push(array.shift());

代码会更有意义,因为你实际上会从数组中取出第一个值并在最后添加回来。但就像代码的第二个版本一样,您最终会得到原始数组。你只需循环元素而不改变它们的顺序。

如何撤销

您可以从数组的两个远端开始交换值,然后向内工作。我将在这里使用ES6解构赋值语法来进行交换:

function reverseArrayInPlace(array) {
  for (var i = array.length - 1, j = 0; i > j; i--, j++) {
    [array[i], array[j]] = [array[j], array[i]];
  }
}
// Demo:
var array = ['a','b','c','d'];
reverseArrayInPlace(array);
console.log(array); // ['d','c','b','a']