JavaScript交换数组元素

有没有更简单的方法来交换数组中的两个元素?

var a = list[x], b = list[y]; list[y] = a; list[x] = b; 

你只需要一个临时variables。

 var b = list[y]; list[y] = list[x]; list[x] = b; 

如果你想要一个单一的expression式,使用native javascript,请记住splice操作的返回值包含被删除的元素。

 var A = [1, 2, 3, 4, 5, 6, 7, 8, 9], x= 0, y= 1; A[x] = A.splice(y, 1, A[x])[0]; alert(A); // alerts "2,1,3,4,5,6,7,8,9" 

编辑:

在expression式的末尾需要[0] ,因为Array.splice()返回一个数组,在这种情况下,我们需要返回数组中的单个元素。

这似乎确定….

 var b = list[y]; list[y] = list[x]; list[x] = b; 

保证使用

 var b = list[y]; 

意味着一个bvariables将会出现在范围的其余部分。 这可能会导致内存泄漏。 不太可能,但仍然可以避免。

也许一个好主意,把这个到Array.prototype.swap

 Array.prototype.swap = function (x,y) { var b = this[x]; this[x] = this[y]; this[y] = b; return this; } 

这可以被称为像:

 list.swap( x, y ) 

这是一个干净的方法,以避免内存泄漏DRY

那么,你不需要缓冲两个值 – 只有一个:

 var tmp = list[x]; list[x] = list[y]; list[y] = tmp; 

使用数值可以避免使用按位异或的临时variables

 list[x] = list[x] ^ list[y]; list[y] = list[y] ^ list[x]; list[x] = list[x] ^ list[y]; 

或算术和(注意这只有在x + y小于数据types的最大值时才起作用)

 list[x] = list[x] + list[y]; list[y] = list[x] - list[y]; list[x] = list[x] - list[y]; 

您可以通过以下方式交换数组中的元素:

 list[x] = [list[y],list[y]=list[x]][0] 

看下面的例子:

 list = [1,2,3,4,5] list[1] = [list[3],list[3]=list[1]][0] //list is now [1,4,3,2,5] 

注意:它对于常规variables的工作方式相同

 var a=1,b=5; a = [b,b=a][0] 

Metafilter的一位随机人士表示 :“Javascript的最新版本让你可以更加巧妙地进行掉换 (除其他外):”

 [ list[x], list[y] ] = [ list[y], list[x] ]; 

我的快速testing显示,此Pythonic代码在“Google Apps Script”(“.gs”)当前使用的JavaScript版本中效果很好。 唉,进一步的testing显示这个代码给出了一个“未捕获的ReferenceError:在赋值中无效的左侧”。 Google Chrome Version 24.0.1312.57 m使用任何版本的JavaScript(“.js”)。

摘自http://www.greywyvern.com/?post=265

 var a = 5, b = 9; b = (a += b -= a) - b; alert([a, b]); // alerts "9, 5" 

交换两个连续的数组元素

 array.splice(IndexToSwap,2,array[IndexToSwap+1],array[IndexToSwap]); 

你可以使用一个简单的标识函数来交换任意数量的对象或文字,甚至是不同types的文字:

 var swap = function (x){return x}; b = swap(a, a=b); c = swap(a, a=b, b=c); 

对于你的问题:

 var swap = function (x){return x}; list[y] = swap(list[x], list[x]=list[y]); 

这在JavaScript中工作,因为它接受额外的参数,即使它们没有被声明或使用。 赋值a=b等,发生在a被传入函数之后。

 var a = [1,2,3,4,5], b=a.length; for (var i=0; i<b; i++) { a.unshift(a.splice(1+i,1).shift()); } a.shift(); //a = [5,4,3,2,1]; 

这7年前不存在,但没有与es2015的新辣酱,你可以使用arrays解构

 var a = 1, b = 2; [a, b] = [b, a]; --> a = 2, b = 1 

对于两个或更多元素(固定号码)

 [list[y], list[x]] = [list[x], list[y]]; 

没有临时variables需要!

我正在考虑简单地调用list.reverse()
但是后来我意识到它只会在list.length = x + y + 1时候作为交换工作。

对于可变数量的元素

我已经研究了各种现代的Javascript结构,包括Map和map ,但是遗憾的是没有一个代码比这个老式的,基于循环的结构更加紧凑或者更快:

 function multiswap(arr,i0,i1) {/* argument immutable if string */ if (arr.split) return multiswap(arr.split(""), i0, i1).join(""); var diff = []; for (let i in i0) diff[i0[i]] = arr[i1[i]]; return Object.assign(arr,diff); } Example: var alphabet = "abcdefghijklmnopqrstuvwxyz"; var [x,y,z] = [14,6,15]; var output = document.getElementsByTagName("code"); output[0].innerHTML = alphabet; output[1].innerHTML = multiswap(alphabet, [0,25], [25,0]); output[2].innerHTML = multiswap(alphabet, [0,25,z,1,y,x], [25,0,x,y,z,3]); 
 <table> <tr><td>Input:</td> <td><code></code></td></tr> <tr><td>Swap two elements:</td> <td><code></code></td></tr> <tr><td>Swap multiple elements:&nbsp;</td> <td><code></code></td></tr> </table> 

有一个有趣的交换方式:

 var a = 1; var b = 2; [a,b] = [b,a]; 

(ES6方式)

这里是一个紧凑版本在i1与i2在arr交换价值

 arr.slice(0,i1).concat(arr[i2],arr.slice(i1+1,i2),arr[i1],arr.slice(i2+1)) 

这是一个variables,首先检查索引是否存在于数组中:

 Array.prototype.swapItems = function(a, b){ if( !(a in this) || !(b in this) ) return this; this[a] = this.splice(b, 1, this[a])[0]; return this; } 

目前只会在索引不存在的情况下返回,但是您可以轻松修改失败时的行为

只是为了它的乐趣,另一种方式没有使用任何额外的variables将是:

 var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; // swap index 0 and 2 arr[arr.length] = arr[0]; // copy idx1 to the end of the array arr[0] = arr[2]; // copy idx2 to idx1 arr[2] = arr[arr.length-1]; // copy idx1 to idx2 arr.length--; // remove idx1 (was added to the end of the array) console.log( arr ); // -> [3, 2, 1, 4, 5, 6, 7, 8, 9] 

这是一个不会改变list的单行代码:

let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})

(当问题发布时,使用语言function在2009年不可用!)

如果需要只交换第一个和最后一个元素:

 array.unshift( array.pop() ); 

这是正确的方法来做到这一点:

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

用法:

 var myArray = [0,1,2,3,4...]; myArray.swap(4,1);