如何在不修改原始数组的情况下反转数组?
该reverse()
方法颠倒了数组中元素的顺序,但它改变了原始数组。我们举一个简单的例子来论证这个案例,
const originalArray = [1, 2, 3, 4, 5];
const newArray = originalArray.reverse();
console.log(newArray); // [ 5, 4, 3, 2, 1]
console.log(originalArray); // [ 5, 4, 3, 2, 1]
很少有解决方案不会改变原始数组。让我们来看看。
-
使用切片和反向方法: 在这种情况下,只需调用
slice()
数组上的方法来创建一个浅拷贝,然后reverse()
调用该拷贝的方法。const originalArray = [1, 2, 3, 4, 5]; const newArray = originalArray.slice().reverse(); //Slice an array gives a new copy console.log(originalArray); // [1, 2, 3, 4, 5] console.log(newArray); // [ 5, 4, 3, 2, 1]
-
使用扩展和反向方法: 在这种情况下,让我们使用扩展语法 (...) 创建数组的副本,然后
reverse()
在副本上调用方法。const originalArray = [1, 2, 3, 4, 5]; const newArray = [...originalArray].reverse(); console.log(originalArray); // [1, 2, 3, 4, 5] console.log(newArray); // [ 5, 4, 3, 2, 1]
-
使用reduce和spread方法: 这里对数组元素执行reducer函数,并使用spread语法将累积的数组附加到右侧
const originalArray = [1, 2, 3, 4, 5]; const newArray = originalArray.reduce((accumulator, value) => { return [value, ...accumulator]; }, []); console.log(originalArray); // [1, 2, 3, 4, 5] console.log(newArray); // [ 5, 4, 3, 2, 1]
-
使用reduceRight 和spread 方法: 这里对数组元素执行右reducer 函数(即reduce 方法的相反方向),并使用spread 语法将累积的数组附加到左侧
const originalArray = [1, 2, 3, 4, 5]; const newArray = originalArray.reduceRight((accumulator, value) => { return [...accumulator, value]; }, []); console.log(originalArray); // [1, 2, 3, 4, 5] console.log(newArray); // [ 5, 4, 3, 2, 1]
-
使用reduceRight 和push 方法: 这里对数组元素执行一个右reducer 函数(即reduce 方法的相反方向)并将迭代的值推送到累加器
const originalArray = [1, 2, 3, 4, 5]; const newArray = originalArray.reduceRight((accumulator, value) => { accumulator.push(value); return accumulator; }, []); console.log(originalArray); // [1, 2, 3, 4, 5] console.log(newArray); // [ 5, 4, 3, 2, 1]