在Javascript中反转数组而不改变原始数组

时间:2015-06-03 03:49:24

标签: javascript arrays

Array.prototype.reverse反转数组的内容(带有变异)......

是否有一个类似的简单策略来反转数组而不改变原始数组的内容(没有变异)?

10 个答案:

答案 0 :(得分:271)

您可以使用slice()复制reverse()

var newarray = array.slice().reverse();



var array = ['a', 'b', 'c', 'd', 'e'];
var newarray = array.slice().reverse();

console.log('a', array);
console.log('na', newarray);




答案 1 :(得分:66)

在ES6中:

const newArray = [...array].reverse()

答案 2 :(得分:4)

另一个ES6变体:

我们也可以使用.reduceRight()创建一个反向数组而不实际反转它。

let A = ['a', 'b', 'c', 'd', 'e', 'f'];

let B = A.reduceRight((a, c) => (a.push(c), a), []);

console.log(B);

有用的资源:

答案 3 :(得分:4)

尝试以下递归解决方案:

const reverse = ([head, ...tail]) => 
    tail.length === 0
        ? [head]                       // Base case -- cannot reverse a single element.
        : [...reverse(tail), head]     // Recursive case

reverse([1]);               // [1]
reverse([1,2,3]);           // [3,2,1]
reverse('hello').join('');  // 'olleh' -- Strings too!                              

答案 4 :(得分:1)

使用.reduce()和扩展的ES6替代方案。

const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);

基本上,它的工作是在foo中使用下一个元素创建一个新数组,并在b之后的每次迭代中散布累积的数组。

[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]

或者如上所述的.reduceRight(),但没有.push()突变。

const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);

答案 5 :(得分:1)

有多种无需修改即可反转阵列的方法。其中两个是

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

// Using Splice
var reverseArray1 = array.splice().reverse(); // Fastest

// Using spread operator
var reverseArray2 = [...array].reverse();

// Using for loop 
var reverseArray3 = []; 
for(var i = array.length-1; i>=0; i--) {
  reverseArray.push(array[i]);
}

性能测试http://jsben.ch/guftu

答案 6 :(得分:0)

ES6:

const reverseArr = [1,2,3,4].sort(()=>1)

答案 7 :(得分:0)

INTO普通Javascript:

function reverseArray(arr, num) {
  var newArray = [];
  for (let i = num; i <= arr.length - 1; i++) {
    newArray.push(arr[i]);
  }

  return newArray;
}

答案 8 :(得分:0)

仅出于说明目的,使用变量交换进行原位反转(但如果您不想变异,则需要副本)

const myArr = ["a", "b", "c", "d"];
const copy = [...myArr];
for (let i = 0; i < (copy.length - 1) / 2; i++) {  
    const lastIndex = copy.length - 1 - i; 
    [copy[i], copy[lastIndex]] = [copy[lastIndex], copy[i]] 
}

答案 9 :(得分:0)

虽然 array.slice().reverse() 是我自己在无法使用库的情况下所采用的方法,但它在可读性方面并不是那么好:我们使用的是命令式逻辑,阅读代码的人必须仔细考虑。考虑到 sort 也存在同样的问题,这里有充分的理由使用实用程序库。

您可以使用 fp-tsa library I've written myself 中的函数 pipe。它通过多个函数传递一个值,因此 pipe(x, a, b) 等价于 b(a(x))。有了这个函数,你就可以写

pipe(yourArray, reverseArray)

其中 reverseArray 是一个基本上执行 .slice().reverse() 的函数,即不可变地反转数组。一般来说,pipe 可以让您进行点链的等效操作,但不限于数组原型上可用的方法。