Typescript 交换数组项

Typescript swap array Items

如何使用 typescript 交换两个元素

elements:elements[] =[];
elements.push(item1);
elements.push(item2);
elements.push(item3);
elements.push(item4);


elements[0] is item1 
elements[3] is item4

我如何在typescript交换这些项目。我知道 Javascript 方式,像这样:

*javascript 使用临时变量的示例 *

var tmp = elements[0];
elements[0] = elements[3];
elements[3] = tmp;

但是在 typescript 中有任何 api 做同样的事情,比如 array.swap()

为什么不使用解构和数组。

[elements[0], elements[3]] = [elements[3], elements[0]];

它没有内置功能,但您可以轻松添加它:

interface Array<T> {
    swap(a: number, b: number): void;
}

Array.prototype.swap = function (a: number, b: number) {
    if (a < 0 || a >= this.length || b < 0 || b >= this.length) {
        return
    }

    const temp = this[a];
    this[a] = this[b];
    this[b] = temp;
}

(code in playground)

如果您使用的是模块,那么您需要这样做来扩充 Array 界面:

declare global {
    interface Array<T> {
        swap(a: number, b: number): void;
    }
}
swapArray(Array:any,Swap1:number,Swap2:number) : any
{
    var temp = Array[Swap1];
    Array[Swap1] = Array[Swap2]
    Array[Swap2] = temp
    return Array;
}

您可以在 Javascript 中的一行中执行此操作(因此在 Typescript 中,尽管在 Typescript 中您可以按照另一个答案所示进行数组解构)。

对于原始类型(例如整数、字符串),您可以执行此操作以交换简单值 a 和 b(信用 here):

a = [b, b=a][0];

因此,如果您有一个包含 3 个元素的数组,如下所示: a=['me','you','us']

您可以像这样交换 'me' 和 'you':

a = [a[1],a[1]=a[0],a[2]]

所以采用 OP 的 4 元素数组,交换第一个(第 0 个)和最后一个(第 3 个)元素,你会做:

elements = [elements[3],elements[1],elements[2],elements[3]=elements[0]]

但是这样的代码不太好理解,所以不推荐。使用 tmp 变量更直接。此外,它的性能和可维护性都不是很好,因为您必须指定原始数组的每个元素。

这个问题很老,但如果你像我一样,你可能遇到过这个 post 检查内置交换行为。

接受的答案使用解构,这很好,但比使用临时交换元素慢。如果性能是一个问题,请使用 OP 描述的临时方法。

A benchmark

结果是解构比临时方法慢一个数量级。