javascript - 如何在没有 Array.prototype.reverse 的情况下反转 JavaScript 中的数组?

标签 javascript arrays reverse

我尝试反转数组,但没有使用 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]))

因为我写了这两个函数来改变输入数组,它可以被重写以防止这种副作用

doc of destructuring assignement

关于javascript - 如何在没有 Array.prototype.reverse 的情况下反转 JavaScript 中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58094902/

相关文章:

c# - 如何像List的Reverse一样实现扩展方法Shuffle而不返回?

c - C 函数的参数是相反的

javascript - 如何编写 .html.erb javascript 函数来隐藏特定页面的标题?

javascript - 如果用户连接/断开与 Facebook 的连接,动态更新页面?

javascript - 在 JavaScript 中将数据构建到多维数组中

c - 在c中反转字符串

JavaScript 计算器无法正常工作

c - 我正在尝试使用 strcmp() 对 C 中的字符串数组进行排序

c++ - 反转字符串中单词的字母

javascript - 合并对象中的多个数组