有其他关于这个问题的问题,但我想知道为什么我的代码不能反转给定的数组。注意:我非常新手,只是自学并尝试为个人兴趣练习。
在书Eloquent Javascript中,我们被要求编写两个不同的函数来反转一个数组。第一个函数reverseArray应该输出一个新的数组,它是给定数组的反转。那个很容易。
第二个函数reverseArrayInPlace应该改变给定的数组,使其反转。假设仅使用第一个函数,然后将其值分配给第一个数组是“作弊”的。此外,我们不能使用.reverse方法。
这是我的尝试,我无法弄清楚为什么它不起作用:
注意:我不喜欢我写的这个函数,但是仍然无法确定为什么它不起作用。
以下是书中给出的测试代码和目标输出:
书中给出的提示是:
“诀窍是交换第一个和最后一个元素,然后交换第二个和倒数第二个元素,以此类推。你可以通过循环数组长度的一半来实现这一点(使用Math.floor向下取整——在长度为奇数的数组中不需要触摸中间元素),并将位置i处的元素与位置array.length-1-i处的元素互换。您可以使用一个本地变量暂时保存其中一个元素,用其镜像图像覆盖该元素,然后将本地变量的值放回镜像图像曾经所在的位置。”
我不喜欢我的想法,但我更不喜欢这个提示。是否有更符合“原地”更改数组精神的方法比我的想法更好?
感谢您的帮助。再次提醒,我们不能只使用所给数组上的.reverse。
在书Eloquent Javascript中,我们被要求编写两个不同的函数来反转一个数组。第一个函数reverseArray应该输出一个新的数组,它是给定数组的反转。那个很容易。
第二个函数reverseArrayInPlace应该改变给定的数组,使其反转。假设仅使用第一个函数,然后将其值分配给第一个数组是“作弊”的。此外,我们不能使用.reverse方法。
这是我的尝试,我无法弄清楚为什么它不起作用:
var reverseArrayInPlace = function(anArray) {
for (var i = 1; i < anArray.length; i++) {
anArray = anArray.slice(i, i+1).concat
(anArray.slice(0,i)).concat(anArray.slice(i+1));
}
}
注意:我不喜欢我写的这个函数,但是仍然无法确定为什么它不起作用。
以下是书中给出的测试代码和目标输出:
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]
书中给出的提示是:
“诀窍是交换第一个和最后一个元素,然后交换第二个和倒数第二个元素,以此类推。你可以通过循环数组长度的一半来实现这一点(使用Math.floor向下取整——在长度为奇数的数组中不需要触摸中间元素),并将位置i处的元素与位置array.length-1-i处的元素互换。您可以使用一个本地变量暂时保存其中一个元素,用其镜像图像覆盖该元素,然后将本地变量的值放回镜像图像曾经所在的位置。”
我不喜欢我的想法,但我更不喜欢这个提示。是否有更符合“原地”更改数组精神的方法比我的想法更好?
感谢您的帮助。再次提醒,我们不能只使用所给数组上的.reverse。
.concat
方法吗? - Dave Cousineauslice
和concat
所做的),如果你想改变一个现有的数组。 - Mike Cluck.slice()
都会创建一个新的数组。这似乎与原地反转的精神相去甚远。 - Pointy