在javascript数组中交换两个项目

ssd*_*ign 36 javascript arrays

可能重复:
Javascript交换数组元素

我有一个像这样的数组:

this.myArray = [0,1,2,3,4,5,6,7,8,9];
Run Code Online (Sandbox Code Playgroud)

现在我想做的是,交换两个项目的位置给出了他们的立场.例如,我想将项目4(即3)与项目8(即7)交换,这应该导致:

this.myArray = [0,1,2,7,4,5,6,3,8,9];
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

ken*_*bec 101

拼接的返回值是被删除的元素 -

不需要临时变量

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));
Run Code Online (Sandbox Code Playgroud)

返回值:(数组)

    0,1,2,7,4,5,6,3,8,9
Run Code Online (Sandbox Code Playgroud)

  • 考虑一下,splice是O(n),http://stackoverflow.com/questions/11514308/big-o-of-javascript-arrays (16认同)

Mic*_*yan 61

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

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);
Run Code Online (Sandbox Code Playgroud)

如果你想让它更容易使用,你甚至可以将它添加到内置阵列原型(如kennebec @建议); 但是,要注意这通常是一个不好的模式要避免(因为当多个不同的库对内置类型中的内容有不同的想法时,这可能会产生问题):

Array.prototype.swap = function(indexA, indexB) {
   swapArrayElements(this, indexA, indexB);
};
// You would use this like myArray.swap(3, 7);
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案比使用splice()的替代方案更有效.(O(1)vs O(n)).

  • 下面的O(1)不是 (10认同)

Nic*_*ver 5

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

var temp = this.myArray[3];
this.myArray[3] = this.myArray[7];
this.myArray[7] = temp;
Run Code Online (Sandbox Code Playgroud)

你可以在这里或以函数形式测试它:

Array.prototype.swap = function(a, b) {
  var temp = this[a];
  this[a] = this[b];
  this[b] = temp;
};
Run Code Online (Sandbox Code Playgroud)

然后你就像这样称呼它:

this.myArray.swap(3, 7);
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试那个版本.