如何在不使用库的情况下在JavaScript中反转数组?

Der*_*會功夫 34 javascript arrays

我正在使用arrays 保存一些数据,我想添加一个用户可以反转列表的功能.我想不出任何可能的方法,所以如果有人知道如何,请帮助.

And*_*ong 90

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

var a = [3,5,7,8];
a.reverse(); // 8 7 5 3
Run Code Online (Sandbox Code Playgroud)

不确定这是"你不能使用的图书馆"的意思,我猜测与练习有关.如果是这种情况,您可以实现自己的版本.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);
Run Code Online (Sandbox Code Playgroud)

请注意,内置.reverse()方法在原始阵列上运行,因此您无需重新分配a.


Roh*_*kar 24

Array.prototype.reverse()是你完成这项工作所需要的一切.请参阅兼容性表.

var arr = [20, 40, 80, 100];

console.log(arr.reverse());
// [100, 80, 40, 20]
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,`concat` 将对象引用复制到新数组中。原始数组和新数组都指向同一个对象... (4认同)
  • 好,非破坏性 (3认同)

Nic*_*k B 20

const original = [1, 2, 3, 4];
const reversed = [...original].reverse(); // 4 3 2 1
Run Code Online (Sandbox Code Playgroud)

简洁,保持原文不变。

  • 由于没有意识到这是一个就地操作,所以损失了半天。感谢您的帮助! (2认同)

小智 17

这是一种功能性的方法.

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

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

  • 如果您不想更改orig数组,这是一个很好的解决方案! (2认同)
  • 如果您正在编写纯函数或不想因任何其他原因改变原始数组,那么这非常有用。 (2认同)

Tor*_*ure 16

20个字节

let reverse=a=>[...a].map(a.pop,a)
Run Code Online (Sandbox Code Playgroud)

  • @ user169320`[... a]`克隆数组,`.map(a.pop,a)`弹出数组(返回数组的最后一个元素)并将其推到新的数组,从而导致反向数组。 (3认同)
  • ...和`map`的第二个参数确保`pop`用`a`作为`this`执行,就像你要做`a.pop()一样 (2认同)
  • 当您传递稍后用于执行的函数引用(因此不执行它)时,该函数引用*没有任何跟踪*您希望在其上执行的对象:它只是一个普通函数。在上面的代码中,你也可以用 `[].pop` 代替 `a.pop`:这将是*完全*相同的函数。当`map` 的实现执行那个函数时,它不知道应该在哪个数组上执行。如果你不说,它就会失败。`map` 的第二个参数为 `map` 提供必要的信息。 (2认同)
  • 是 CodeGolf 吗? (2认同)
  • 非常聪明,但请记住,这会改变您的原始数组,使其变空(也许之前使用深度冻结) (2认同)

Eli*_*ady 10

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

let reverse = a=>a.sort(a=>1)
Run Code Online (Sandbox Code Playgroud)

  • 这不取决于排序是如何实现的吗?由于比较函数不一致(即它总是返回 1),因此行为未定义。 (2认同)

Ras*_*bal 7

两种方式:

  1. 计数器循环

    function reverseArray(a) { 
         var rA = []
         for (var i = a.length; i > 0; i--) {
             rA.push(a[i - 1])
         } 
    
         return rA;
      }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 .reverse()

     function reverseArray(a) {  
         return a.reverse()  
      }
    
    Run Code Online (Sandbox Code Playgroud)


Der*_*會功夫 6

53字节

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

只是为了好玩,这里有一个比本机方法更快的替代实现.reverse


Kan*_*ger 6

你可以做

var yourArray = ["first", "second", "third", "...", "etc"]
var reverseArray = yourArray.slice().reverse()

console.log(reverseArray)
Run Code Online (Sandbox Code Playgroud)

你会得到

["etc", "...", "third", "second", "first"]
Run Code Online (Sandbox Code Playgroud)


par*_*tel 6

**

不使用反向方法的最短反向数组方法:

**

 var a = [0, 1, 4, 1, 3, 9, 3, 7, 8544, 4, 2, 1, 2, 3];

 a.map(a.pop,[...a]); 
// returns [3, 2, 1, 2, 4, 8544, 7, 3, 9, 3, 1, 4, 1, 0]
Run Code Online (Sandbox Code Playgroud)

a.pop 方法取下最后一个元素并使用扩展运算符 () 放在前面

MDN 链接供参考:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop


qwe*_*ymk 5

这就是你想要的:

array.reverse();
Run Code Online (Sandbox Code Playgroud)

DEMO

  • 请注意,array.reverse()将更改原始数组上元素的顺序。 (2认同)

Fra*_*bot 5

> var arr = [1,2,3,4,5,6];
> arr.reverse();
  [6, 5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)


Jag*_*agi 5

我已经对解决方案进行了一些测试,不仅可以反转数组,还可以制作其副本。这是测试代码。该reverse2方法在 Chrome 中是最快的,但在 Firefox 中reverse也是最快的。

var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

var reverse1 = function() {
  var reversed = array.slice().reverse();
};

var reverse2 = function() {
  var reversed = [];
  for (var i = array.length - 1; i >= 0; i--) {
    reversed.push(array[i]);
  }
};

var reverse3 = function() {
  var reversed = [];
  array.forEach(function(v) {
    reversed.unshift(v);
  });
};

console.time('reverse1');
for (var x = 0; x < 1000000; x++) {
  reverse1();
}
console.timeEnd('reverse1'); // Around 184ms on my computer in Chrome

console.time('reverse2');
for (var x = 0; x < 1000000; x++) {
  reverse2();
}
console.timeEnd('reverse2'); // Around 78ms on my computer in Chrome

console.time('reverse3');
for (var x = 0; x < 1000000; x++) {
  reverse3();
}
console.timeEnd('reverse3'); // Around 1114ms on my computer in Chrome
Run Code Online (Sandbox Code Playgroud)


小智 5

这是一个不需要临时数组的版本。

function inplaceReverse(arr) {
  var i = 0;
  while (i < arr.length - 1) {
    arr.splice(i, 0, arr.pop());
    i++;
  }
  return arr;
}

// Useage:
var arr = [1, 2, 3];
console.log(inplaceReverse(arr)); // [3, 2, 1]
Run Code Online (Sandbox Code Playgroud)


Ali*_*aei 5

reveresed = [...array].reverse()
Run Code Online (Sandbox Code Playgroud)