我尝试反转数组,但没有使用 reverse
函数。
如您所见,我尝试减少数组 num=(tab.length-i)-1
的长度,所以它起作用了。但是当我尝试添加 tab[i]=tab[num]
时,它起作用了,但是 tab[i]
中的值 push 是随机的 [ 10, 9 , 8, 7, 6, 6, 7, 8, 9, 10 ]
。
你知道为什么吗?
const tab=[1,2,3,4,5,6,7,8,9,10]
let num=0
for(let i=0;i<tab.length;i++){
num=(tab.length-i)-1
console.log(num)
tab[i]=tab[num]
}
最佳答案
问题是您在查看数组的同时修改了它,所以当您到达中间元素时它已经被修改了。
这是您的脚本的手动执行:
i | tab
0 | [1,2,3,4,5,6,7,8,9,10]
1 | [10,2,3,4,5,6,7,8,9,10]
2 | [10,9,3,4,5,6,7,8,9,10]
3 | [10,9,8,4,5,6,7,8,9,10]
4 | [10,9,8,7,5,6,7,8,9,10]
5 | [10,9,8,7,6,6,7,8,9,10]
6 | [10,9,8,7,6,6,7,8,9,10]
7 | ...
8 | ...
9 | ...
我想你可以看出问题所在
有两种方法可以解决这个问题:
// either create a temp array to keep previous values
const reverseWithTmpArray = arr => {
let tmp = [...arr]
for(let i = 0; i < arr.length; i++){
let num = (arr.length - i) - 1
arr[i] = tmp[num]
}
return arr
}
// or reverse the element by pairs
const reverseByPairs = arr => {
for(let i = 0; i < arr.length / 2; i++){
let num = (arr.length - i) - 1
let tmp = arr[i]
arr[i] = arr[num]
arr[num] = tmp
// can also be written
// [arr[i], arr[num]] = [arr[num], arr[i]]
// using destructuring assignement
}
return arr
}
console.log(reverseWithTmpArray([1,2,3,4,5,6,7,8,9,10]))
console.log(reverseByPairs([1,2,3,4,5,6,7,8,9,10]))
因为我写了这两个函数来改变输入数组,它可以被重写以防止这种副作用
关于javascript - 如何在没有 Array.prototype.reverse 的情况下反转 JavaScript 中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58094902/