在Javascript数组中交换两个元素

45

可能是重复问题:
JavaScript交换数组元素

我有一个像这样的数组:

this.myArray = [0,1,2,3,4,5,6,7,8,9];

现在我想做的是,交换两个给定位置上的项目。 例如,我想将第4项(即3)与第8项(即7)交换位置,结果应该是:

this.myArray = [0,1,2,7,4,5,6,3,8,9];

我该如何实现这个?


2
复制(带有一些令人惊讶的解决方案,供您娱乐)- https://dev59.com/DHNA5IYBdhLWcg3wrP2q - Chetan S
3个回答

123
从splice返回的值是被移除的元素,不需要临时变量。
Array.prototype.swapItems = function(a, b){
    this[a] = this.splice(b, 1, this[a])[0];
    return this;
}

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

alert(arr.swapItems(3, 7));

返回值:(数组)

    0,1,2,7,4,5,6,3,8,9

1
不错啊!怎么没人给这个答案点赞呢? - zachzurn
理解这个解决方案的关键在于splice()可以在start和deleteCount之后插入其他项,这些项将被插入到拼接位置。唯一的问题是splice()返回一个数组,因此要从该数组中获取一个(且仅有的)元素,需要这样说:this[a]= this.splice(b, 1, this[a])[0]; - trembl
19
考虑到这一点,splice的时间复杂度为O(n)。参考链接:https://dev59.com/l2gu5IYBdhLWcg3wLEM9 - Nick

88

只需重新分配元素,创建一个中间变量来保存第一个被覆盖的元素:

var swapArrayElements = function(arr, indexA, indexB) {
  var temp = arr[indexA];
  arr[indexA] = arr[indexB];
  arr[indexB] = temp;
};
// You would use this like: swapArrayElements(myArray, 3, 7);
如果你想让这更容易使用,甚至可以将其添加到内置的Array原型中(如kennebec@所建议的); 但是,请注意,通常应避免这种不良模式(因为当多个不同的库对内置类型具有不同的理解时,可能会出现问题):
Array.prototype.swap = function(indexA, indexB) {
   swapArrayElements(this, indexA, indexB);
};
// You would use this like myArray.swap(3, 7);

注意,这种解决方案比使用splice()的替代方案要高效得多。(O(1) vs O(n))。


10
O(1)以下的内容并非指时间复杂度为O(1)。 - Nick
const swapArrayElements = (arr, a, b) => { let _arr = [...arr]; let temp = _arr[a]; _arr[a] = _arr[b]; _arr[b] = temp; return _arr } - Ed Williams

5

您可以使用临时变量来移动元素,例如:

var temp = this.myArray[3];
this.myArray[3] = this.myArray[7];
this.myArray[7] = temp;

你可以在这里测试,或者使用函数形式:

Array.prototype.swap = function(a, b) {
  var temp = this[a];
  this[a] = this[b];
  this[b] = temp;
};

那么您只需要这样调用它:
this.myArray.swap(3, 7);

您可以在这里测试该版本


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