我必须编写一个反转数组的函数(我知道反向方法,但这次我必须编写一个函数)。此函数必须将数组变量作为输入并返回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;
};

虽然他们做的事情完全一样吗?
答案 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']
...和你开始时使用相同阵列的背部。
请注意,shift
和push
似乎排列错误,无论如何都有用。此外,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]
,但正如你所看到的那样纯粹是偶然的)。
如果你像这样交换了shift
和push
:
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']