Javascript中的反向数组而不更改原始数组


Answers:


373

您可以使用片() ,使该拷贝逆转()

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


你能解释不带参数的slice()吗?
亚历克斯

3
@Alex 切片 - If begin is omitted, slice begins from index 0.-因此它是相同的array.slice(0)
阿伦P约翰尼拉

2
我认为@Alex的意思是“在您的答案中对其进行解释” ...无论如何...出色的解决方案。谢谢!
sfletche 2015年

12
我不建议使用这种方法,因为这是一种非常容易引起误解的做法。当您使用slice()而实际上没有切片时,这非常令人困惑。如果您需要一成不变的反向,只需创建新的新副本即可: const newArray = [... array] .reverse()
Oleg Matei

104

在ES6中:

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

2
此性能与公认答案的性能如何?他们是一样的吗?
凯蒂(Katie)

@Katie非常相似,两者都非常快,Chrome [...].reverse在一个非常简单的测试用例中似乎具有优势。jsperf.com/reverse-vs-slice-reverse/1
Brian M. Hunt,

4
我一直在.slice进步得更快。
詹姆士·科伊尔

3
@JamesCoyle可能取决于浏览器和OS,但slice可能会更快b / c [...]是一个通用的可迭代数组,因此无法做太多假设。同样,slice经过更好的优化,很可能已经存在了很长时间。
Brian M. Hunt,

我的想法完全正确。
詹姆士·科伊尔

11

ES6的另一个变体:

我们还可以.reduceRight()用于创建反向数组,而无需实际对其进行反转。

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

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

console.log(B);

有用的资源:


2
reduceRight是慢后
Dragos Rizescu '18

@DragosRizescu可以分享一些示例测试结果吗?
Mohammad Usman '18

1
这是一个您可以使用的存储库:(不是最好的例子,但是在React上下文中与某人有此参数,因此我将其放在一起):github.com/rizedr/reduce-vs-reduceRight
Dragos Rizescu

4
(a, c) => a.concat([c])比感觉更地道(a, c) => (a.push(c), a)
凯尔林

1
@DragosRizescu实际上看起来这是3个最佳答案中最快的。jsperf.com/reverse-vs-slice-reverse/3
DBosley,

7

尝试以下递归解决方案:

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!                              

1
看起来它将为空数组而中断。
Matthias

6

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

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]), []);

4

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

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


0

INTO普通Javascript:

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

  return newArray;
}

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]] 
}

-4

es6:

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

4
欢迎来到Radion!留下答案时,通常最好解释一下答案为何起作用以及为什么得出此结论,这有助于新用户了解您指定的交互和语言。
伊桑·菲尔德

在Radion的辩护中:P 1最后可以是大于零的值,因为这就是Array.prototype.sort回调(或所谓的compare function)的工作方式。基本上你总是比较两个数在这种情况下,比较收益总是正的,因此说总是移动到第二个数字中的第一个前:)这是很说明: stackoverflow.com/questions/6567941/...
iulial

8
sort()改变数组(即,将其排序),这是OP想要避免的。
克林特·哈里斯

5
这个答案在几种方面都是错误的。(1)就像@ClintHarris指出的,它使数组发生变化,因此它并不比.reverse()好。(2)您的比较器是非法的-当您为a,b返回1时,您必须为b,a返回负数。如果您的答案在某些实现上逆转了数组,那完全是靠运气。
唐·哈奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.