array .prototype.reverse将数组的内容反向(带有突变)…

是否有类似的简单策略来反转数组而不改变原始数组的内容(不发生突变)?


当前回答

在ES6:

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

其他回答

有多种方法可以在不修改的情况下反转数组。其中两个是

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

ES6的另一个变体:

我们也可以使用. reduceright()来创建一个反向数组,而不是真正地将它反向。

let A = [' A ', 'b', 'c', 'd', 'e', 'f']; 让B = A.reduceRight ((a、c) = > (a.push (c), a), []); console.log (B);

有用的资源:

Array.prototype.reduceRight () 箭头功能 逗号操作符

进入2022年,这是当今最高效的解决方案(性能最高,并且没有额外的内存占用)。


对于任何ArrayLike类型,逻辑上最快的反转方法是将其包装为反转迭代对象:

function reverse<T>(input: ArrayLike<T>): Iterable<T> {
    return {
        [Symbol.iterator](): Iterator<T> {
            let i = input.length;
            return {
                next(): IteratorResult<T> {
                    return i
                        ? {value: input[--i], done: false}
                        : {value: undefined, done: true};
                },
            };
        },
    };
}

通过这种方式,你可以反向迭代任何数组,字符串或缓冲区,而不需要任何额外的复制或处理反向数据:

for(const a of reverse([1, 2, 3])) {
    console.log(a); //=> 3 2 1
}

这是最快的方法,因为你不复制数据,也不做任何处理,你只是在逻辑上反向。

const originalArray = [a, b, c, d, e, f); const newArray = Array.from(originalArray).reverse(); console.log (newArray);

是否有类似的简单策略来反转数组而不改变原始数组的内容(不发生突变)?

是的,有一种方法可以通过使用to[Operation]来实现这一点,它返回一个带有应用操作的新集合(目前处于第3阶段,很快就会可用)。

实现方式如下:

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

const reversedArr = arr.toReverse();

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

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