TypeScript交换数组项

8

如何使用 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 中是否有类似于 array.swap() 的 API 可以实现相同的功能呢?


不是你要找的答案,但似乎JavaScript示例是通常的示例。https://dev59.com/DHNA5IYBdhLWcg3wrP2qhttps://dev59.com/zW865IYBdhLWcg3wEKKZhttps://www.kirupa.com/html5/swapping_items_array_js.htm - Kapein
@Kapein 我知道用纯 JavaScript 很简单,但是我能知道使用 TypeScript 做这个的任何 API 吗?你明白我的意思吗? - Jagadeesh Govindaraj
这个的Angular 2版本是什么? - Kapein
1
TS没有任何特殊的API,它是一种类型化的JS。 - Estus Flask
5个回答

60

为什么不使用解构和数组呢?

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

6
这是正确的答案。在这里查看有关数组解构的主题:https://www.typescriptlang.org/docs/handbook/variable-declarations.html - rmcsharry
这与 noUncheckedIndexedAccess 编译器选项不兼容。 - Marcel

4

没有内置的功能来实现它,但你可以轻松地添加它:

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

如果您正在使用模块,则需要执行以下操作来增强Array接口:
在 playground 中查看代码
declare global {
    interface Array<T> {
        swap(a: number, b: number): void;
    }
}

2
在 TypeScript 中,有内置的功能来实现这一点。它被称为数组解构 - 请参阅 Nina 的答案。 - rmcsharry
@rmcsharry 这不一样。如果您不想创建新实例,而是想在数组本身中进行交换怎么办? - Nitzan Tomer
这就是Nina的回答所展示的 - 没有创建新实例,而是在数组本身内部交换数据。 - rmcsharry
@rmcsharry 你是对的,我的错,我没有太注意到它。 - Nitzan Tomer
@rmcsharry 好的,现在我有时间仔细审查问题和答案后,OP要求“像array.swap()这样的api”,这就是我给他的。你可以争论方法本身的实现可能应该使用解构方式,但那不是我回答的主要部分。 - Nitzan Tomer
很好,但是OP也问了“如何在TypeScript中交换这些项目”,因此两个答案都是正确的,因为实际上有两个问题 ;) - rmcsharry

4
swapArray(Array:any,Swap1:number,Swap2:number) : any
{
    var temp = Array[Swap1];
    Array[Swap1] = Array[Swap2]
    Array[Swap2] = temp
    return Array;
}

1
这个问题很旧,但如果你像我一样,可能会查看此帖子以检查是否有内置的交换行为。
接受的答案使用解构,这很好,但是比使用临时变量交换元素要慢。如果性能是一个问题,请使用 OP 描述的临时方法。 基准测试 结果是解构比临时方法慢一个数量级。

enter image description here


1
谢谢你的回答和比较。你能把基准测试结果也加到你的回答里吗?提供一个基准测试的链接也可以,但如果这个链接将来失效了,那么这个回答就没用了。 - Michael Kotzjan

1
你可以在Javascript中用一行代码实现这个操作(因此在Typescript中也可以,尽管在Typescript中你可以使用数组解构,如另一个答案所示)。
对于原始类型(例如整数、字符串),你可以使用以下代码交换简单的值a和b(参考这里):
a = [b, b=a][0];

如果你有一个包含3个元素的数组,就像这样:a=['我','你','我们']

你可以像这样交换'我'和'你':

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

因此,以OP的4元素数组为例,要交换第一个(0号)和最后一个(3号)元素,你需要执行以下操作:

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

然而,这段代码并不容易理解,因此我不建议使用它。使用临时变量更加直观。此外,由于您必须指定原始数组的每个元素,因此它的性能和可维护性也不是很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接