如何在JavaScript中不使用库反转一个数组?

102

我正在使用 array 保存一些数据,并希望添加一个函数,使用户可以反转列表。我目前想不到任何可能的方法,如果有人知道,请帮忙。


2
@jbabey "下次试试谷歌?" Stackoverflow不是粗鲁的地方。 - Brian Webster
37个回答

192

Javascript有一个reverse()方法,可以在数组中调用。

var a = [3,5,7,8];
a.reverse(); // 8 7 5 3

不确定您所说的“不能使用的库”是否是指实践中的某些事情。如果是这种情况,您可以实现自己的.reverse()版本。

function reverseArr(input) {
    var ret = new Array;
    for(var i = input.length-1; i >= 0; i--) {
        ret.push(input[i]);
    }
    return ret;
}

var a = [3,5,7,8]
var b = reverseArr(a);

请注意,内置的.reverse()方法操作的是原始数组,因此您不需要重新分配a


使用 [...arr].reverse() 进行无破坏性的反转。 - Ali Mert Çakar
const b = a.toReversed(); 返回一个新的数组,保持原始数组不变。 - undefined

62

Array.prototype.reverse()是你需要做这个工作的全部内容。请参见兼容性表

var myArray = [20, 40, 80, 100];
var revMyArr = [].concat(myArray).reverse();
console.log(revMyArr);
// [100, 80, 40, 20]


11
好的,我会尽力进行翻译。以下是您需要翻译的内容:nice, non-destructive温和、非破坏性 - Larry
4
请注意,concat 方法将对象引用复制到新数组中。原始数组和新数组都指向同一对象... - Mohammad Usman

31

这是一个实用的方法。

const array = [1,2,3,4,5,6,"taco"];

function reverse(array){
  return array.map((item,idx) => array[array.length-1-idx])
}

3
如果您不想改变原始数组,那么这是一个简单而优秀的解决方案! - DNLST
2
如果你正在编写一个纯函数或者由于其他原因不想改变原始数组,那么这非常棒。 - freethebees

24

20字节

let reverse=a=>[...a].map(a.pop,a)

5
@user169320 [...a] 克隆了该数组,.map(a.pop, a)弹出该数组(返回数组的最后一个元素)并将其推入新数组,这导致形成一个反转的数组。 - Derek 朕會功夫
3
map 的第二个参数确保使用 a 作为 this 执行 pop,就像你执行 a.pop() 一样。 - trincot
2
当您传递一个函数引用(因此不执行它),稍后用于执行时,那个函数引用就完全没有您想要执行的对象的痕迹:它只是一个普通的函数。在上面的代码中,您可以放置[].pop而不是a.pop:它们是*完全相同的函数。当map的实现执行该函数时,它不知道应该在哪个数组上执行。如果您不告诉它,它将失败。map的第二个参数提供了map所需的信息。 - trincot
2
这是 CodeGolf 吗? - user9258013
2
相当聪明,但请记住,这将改变您的原始数组,使其为空(也许在此之前使用深度冻结)。 - Radu Chiriac
显示剩余3条评论

20
const original = [1, 2, 3, 4];
const reversed = [...original].reverse(); // 4 3 2 1

简洁并保持原意不变。


非常有用,您解决了我在反转状态方面的问题。 - Sathis Sakthivel
2
由于没有意识到这是一个原地操作,刚刚浪费了半天时间。感谢您的帮助! - Greg

11
reveresed = [...array].reverse()

10

我见过的最简短的反转方法是这个:

let reverse = a=>a.sort(a=>1)

4
这不取决于排序是如何实现的吗?由于比较函数不一致(即它总是返回1),所以行为是未定义的。 - Derek 朕會功夫
实际上,我对它的工作方式感到惊讶。 例如,[1,2,3,4].sort(a=>1) 返回了正确的答案。 这个想法与 sort 方法如何接受排序算法密切相关,因为它是逐个进行排序,所以总是会交换。 - Elia Grady
这个问题在于它可能无法使用不同的解释器来反转数组。 - Derek 朕會功夫
1
我并不认为这是一个好的做法,只是觉得这是对一个众所周知的操作的有趣而非传统的看法。 - Elia Grady

7

两种方式:

  1. counter loop

    function reverseArray(a) { 
         var rA = []
         for (var i = a.length; i > 0; i--) {
             rA.push(a[i - 1])
         } 
    
         return rA;
      }
    
  2. Using .reverse()

     function reverseArray(a) {  
         return a.reverse()  
      }
    

7
这是您想要的内容:
array.reverse();

DEMO


4
请注意,array.reverse()会改变原始数组中元素的顺序。 - thexpand

6

53字节

function reverse(a){
    for(i=0,j=a.length-1;i<j;)a[i]=a[j]+(a[j--]=a[i++],0)
}

仅供娱乐,这里有一个替代实现,比原生的.reverse方法更快。


我一直在寻找那些简单、兼容和简洁的解决方案中的钻石。在这种情况下,你为我赢得了这个问题。可以请您详细解释吗? - Alexander Dixon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接