86

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

4

36 回答 36

155

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

于 2012-04-16T02:27:14.283 回答
51

Array.prototype.reverse()是您完成这项工作所需的全部内容。请参阅兼容性表

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

于 2016-02-19T10:35:31.173 回答
28

这是一种功能性的方法。

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

function reverse(array){
  return array.map((item,idx) => array[array.length-1-idx])
}
于 2017-03-17T03:15:35.110 回答
22

20 字节

let reverse=a=>[...a].map(a.pop,a)
于 2017-11-27T23:14:38.263 回答
10

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

let reverse = a=>a.sort(a=>1)
于 2018-06-08T20:35:52.163 回答
9
reveresed = [...array].reverse()
于 2020-08-16T11:44:16.193 回答
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]

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

于 2019-04-24T02:29:19.863 回答
6
const original = [1, 2, 3, 4];
const reversed = [...original].reverse(); // 4 3 2 1

简明扼要,保持原样不变。

于 2021-07-21T21:28:42.917 回答
5

这就是你想要的:

array.reverse();

演示

于 2012-04-16T02:25:14.270 回答
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
于 2015-05-09T10:59:14.040 回答
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]
于 2015-07-20T20:55:29.737 回答
4
> var arr = [1,2,3,4,5,6];
> arr.reverse();
  [6, 5, 4, 3, 2, 1]
于 2012-04-16T02:26:56.187 回答
4
array.reverse() 

上面将反转您的数组,但会修改原始数组。如果您不想修改原始数组,则可以这样做:

var arrayOne = [1,2,3,4,5];

var reverse = function(array){
    var arrayOne = array
    var array2 = [];

    for (var i = arrayOne.length-1; i >= 0; i--){
      array2.push(arrayOne[i])
    } 
    return array2
}

reverse(arrayOne)
于 2015-04-22T16:07:05.480 回答
4
function reverseArray(arr) {
    let reversed = [];
    for (i = 0; i < arr.length; i++) { 
    reversed.push((arr[arr.length-1-i]))
    }
  return reversed;
}
于 2017-05-23T12:29:11.947 回答
4

你可以做

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

console.log(reverseArray)

你会得到

["etc", "...", "third", "second", "first"]
于 2017-12-03T10:23:04.953 回答
4

使用 .pop() 方法和 while 循环。

var original = [1,2,3,4];
var reverse = [];
while(original.length){
    reverse.push(original.pop());
}

输出:[4,3,2,1]

于 2019-08-26T19:22:33.780 回答
3

53 字节

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

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

于 2017-08-08T20:48:31.957 回答
3

使用函数式编程反转数​​组的纯函数:

var a = [3,5,7,8];

// ES2015
function immutableReverse(arr) {
  return [ ...a ].reverse();
}

// ES5
function immutableReverse(arr) {
  return a.concat().reverse()
}
于 2017-11-06T09:51:52.813 回答
3

正如其他人提到的,您可以.reverse()在数组对象上使用。

但是,如果您关心保留原始对象,则可以reduce改用:

const original = ['a', 'b', 'c'];
const reversed = original.reduce( (a, b) => [b].concat(a) );
//                                           ^
//                                           |
//                                           +-- prepend b to previous accumulation

// original: ['a', 'b', 'c'];
// reversed: ['c', 'b', 'a'];
于 2018-10-09T13:29:31.840 回答
3

也可以使用map方法来实现。

[1, 2, 3].map((value, index, arr) => arr[arr.length - index - 1])); // [3, 2, 1]

或使用reduce(稍微长一点的方法)

[1, 2, 3].reduce((acc, curr, index, arr) => {
    acc[arr.length - index - 1] = curr;
    return acc;
}, []);
于 2019-06-03T20:19:07.700 回答
3

我不确定库是什么意思,但这是我能想到的最好方法:

// return a new array with .map()
const ReverseArray1 = (array) => {
    let len = array.length - 1;

    return array.map(() => array[len--]);
}

console.log(ReverseArray1([1,2,3,4,5])) //[5,4,3,2,1]

// initialize and return a new array
const ReverseArray2 = (array) => {
    const newArray = [];
    let len = array.length;

    while (len--) {
        newArray.push(array[len]);
    }

    return newArray;
}

console.log(ReverseArray2([1,2,3,4,5]))//[5,4,3,2,1]

// use swapping and return original array
const ReverseArray3 = (array) => {
    let i = 0;
    let j = array.length - 1;

    while (i < j) {
        const swap = array[i];
        array[i++] = array[j];
        array[j--] = swap;
    }

    return array;
}
console.log(ReverseArray3([1,2,3,4,5]))//[5,4,3,2,1]

// use .pop() and .length
const ReverseArray4 = (array) => {
    const newArray = [];

    while (array.length) {
        newArray.push(array.pop());
    }

    return newArray;
}
console.log(ReverseArray4([1,2,3,4,5]))//[5,4,3,2,1]
于 2019-11-18T01:21:55.260 回答
3

使用变量交换(可变)反转到位

const myArr = ["a", "b", "c", "d"];
for (let i = 0; i < (myArr.length - 1) / 2; i++) {  
    const lastIndex = myArr.length - 1 - i; 
    [myArr[i], myArr[lastIndex]] = [myArr[lastIndex], myArr[i]] 
}
于 2020-02-21T03:26:10.147 回答
2

使用 sort 方法进行反转

  • 这是一种更简洁的方法。

const resultN = document.querySelector('.resultN');
const resultL = document.querySelector('.resultL');

const dataNum = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const dataLetters = ['a', 'b', 'c', 'd', 'e'];

const revBySort = (array) => array.sort((a, b) => a < b);

resultN.innerHTML = revBySort(dataNum);
resultL.innerHTML = revBySort(dataLetters);
<div class="resultN"></div>
<div class="resultL"></div>

于 2016-05-16T17:13:05.567 回答
2

使用 ES6 的 rest 运算符和箭头函数。

const reverse = ([x, ...s]) => x ? [...reverse(s), x] : [];
reverse([1,2,3,4,5]) //[5, 4, 3, 2, 1]
于 2018-10-25T07:15:25.210 回答
2

两种方式:

  1. 计数器循环

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

     function reverseArray(a) {  
         return a.reverse()  
      }
    
于 2021-02-18T21:33:56.657 回答
1

使用交换并返回原始数组。

const reverseString = (s) => {
  let start = 0, end = s.length - 1;
  while (start < end) {
    [s[start], s[end]] = [s[end], s[start]]; // swap
    start++, end--;
  }
  return s;
};

console.log(reverseString(["s", "t", "r", "e", "s", "s", "e", "d"]));

于 2020-12-14T14:38:05.450 回答
1

事实上,reverse()在某些情况下可能不起作用,所以你必须先做一个做作,如下所示

let a = [1, 2, 3, 4];
console.log(a);  // [1,2,3,4]
a = a.reverse();
console.log(a); // [4,3,2,1]

或使用concat

let a = [1, 2, 3, 4];
console.log(a, a.concat([]).reverse());  // [1,2,3,4], [4,3,2,1]
于 2021-05-17T18:18:14.533 回答
0

不使用 push() 怎么办!

使用异或的解决方案

var myARray = [1,2,3,4,5,6,7,8];

function rver(x){
    var l = x.length;
    for(var i=0; i<Math.floor(l/2); i++){

        var a = x[i];
        var b = x[l-1-i];

        a = a^b;
        b = b^a;
        a = a^b;

        x[i] = a;
        x[l-1-i] = b;
    }

    return x;

}

console.log(rver(myARray));
于 2015-12-01T20:29:20.083 回答
0

JavaScript 已经在 Array 上有 reverse() 方法,所以你不需要做那么多!

想象一下你有下面的数组:

var arr = [1, 2, 3, 4, 5];

现在只需这样做:

arr.reverse();

你得到这个结果:

[5, 4, 3, 2, 1];

但这基本上改变了原始数组,您可以编写一个函数并使用它来返回一个新数组,如下所示:

function reverse(arr) {
  var i = arr.length, reversed = [];
  while(i) {
    i--;
    reversed.push(arr[i]);
  }
  return reversed;
}

或者简单地改变 Array 的 JavaScript 内置方法,如下所示:

function reverse(arr) {
  return arr.slice().reverse();
}

你可以这样称呼它:

reverse(arr); //return [5, 4, 3, 2, 1];

如前所述,主要区别在于第二种方式,您不要触摸原始数组...

于 2017-06-18T04:56:43.273 回答
0

这个怎么样?:

  function reverse(arr) {
    function doReverse(a, left, right) {
      if (left >= right) {
        return a;
      }
      const temp = a[left];
      a[left] = a[right];
      a[right] = temp;
      left++;
      right--;
      return doReverse(a, left, right);
    }

    return doReverse(arr, 0, arr.length - 1);
  }

  console.log(reverse([1,2,3,4]));

https://jsfiddle.net/ygpnt593/8/

于 2018-06-27T05:42:02.333 回答
0

此函数适用于索引之间可能存在间隙的数组。

function reverse( a ) {
    var b = [], c = [] ;
    a.forEach( function( v ) { b.push( v ) } ) ;
    a.forEach( function( v, i ) { c[i] = b.pop() } ) ;
    return c ;
}

var a= [] ; a[1] = 2 ; a[3] = 4 ; a[7] = 6 ; a[9] = 8 ;
a = reverse( a ) ;
var s = '' ;
a.forEach( function( v, i ) { s += 'a[' + i + '] = ' + v + '  ' } ) ;
console.log( s ) ;
// a[1] = 8  a[3] = 6  a[7] = 4  a[9] = 2
于 2019-03-23T21:18:10.883 回答
0

以下是具有最佳空间和时间复杂度的解决方案

function reverse(arr){
let i = 0;
let j = arr.length-1; 
while(i<j){
arr[j] = arr[j]+arr[i];
arr[i] = arr[j] - arr[i];
arr[j] = arr[j] - arr[i];
i++;
j--;
}
return arr;
}
var arr = [1,2,3,4,5,6,7,8,9]
reverse(arr);

输出 => [9,8,7,6,5,4,3,2,1]

于 2019-05-21T08:57:23.640 回答
0

使用 ES6 反转数组和子数组(就地)。

function reverse(array, i=0, j=array.length-1){
  while (i < j){
    [array[i], array[j]] = [array[j], array[i]];
    ++i;
    --j;
  }
}
于 2020-03-01T01:02:27.460 回答
0

我们有 reverse() 函数来反转 JS 中的给定数组。

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

function reverseArr(input) 
{
var ret = new Array;
for(var i = input.length-1; i >= 0; i--) 
{
    ret.push(input[i]);
}
return ret;
}
于 2020-03-19T04:36:28.390 回答
0

我也面临同样的问题。谢谢你的这个问题。我做了如下代码片段的代码。它工作得很好。我用的是 ES6。

const Array = ["a", "b", "c", "d"];
let revArray = [].concat(Array).reverse();

当我 console.log 它时,我得到如下输出

console.log(revArray)
// output: ["d","c","b","a"]
于 2020-04-25T13:53:40.367 回答
-1

我只是将haskell实现重写为js。

const rev = (list, reversed) => {
    if (list.length == 0) return reversed

    reversed.unshift(list[0])
    return rev(list.slice(1), reversed)
}

const reverse = (list) => rev(list, [])
于 2018-03-06T23:38:37.647 回答