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

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

当前回答

根据Metafilter上的某个人的说法, “最新版本的Javascript允许你更整洁地进行交换(以及其他事情):”

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

我的快速测试表明,这段python代码在JavaScript版本中运行良好 目前在“谷歌Apps Script”(“.gs”)中使用。 遗憾的是,进一步的测试表明这段代码给出了一个“Uncaught ReferenceError: Invalid left side in assignment.” 使用的JavaScript (".js")的任何版本 谷歌Chrome版本24.0.1312.57 m。

其他回答

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

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

考虑这样一个解决方案,不需要定义第三个变量:

函数swap(arr, from, to) { 加勒比海盗。拼接(from, 1, arr.)Splice (to, 1, arr[from])[0]); } Var字母= ["a", "b", "c", "d", "e", "f"]; 交换(字母,1,4); console.log(字母);// ["a", "e", "c", "d", "b", "f"]

注意:您可能希望添加额外的检查,例如数组长度检查。这个解决方案是可变的,所以交换函数不需要返回一个新的数组,它只是对传入的数组进行突变。

您只需要一个临时变量。

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

10年后,随着ES6的大量采用,编辑劫持了最重要的答案:

给定数组arr =[1,2,3,4],你现在可以在一行中交换值,如下所示:

[arr[0], arr[1]] = [arr[1], arr[0]];

这将产生数组[2,1,3,4]。这是解构赋值。

如果你因为某些原因不允许使用就地交换,这里有一个map的解决方案:

函数swapElements(数组,源,dest) { 返回源=== dest ? Array:阵列。Map ((item, index) => index === source ? 数组[dest]: index === dest ? 数组[来源]:item); } Const arr = ['a', 'b', 'c']; const s1 = swapElements(arr, 0,1); Console.log (s1[0] === 'b'); Console.log (s1[1] === 'a'); const s2 = swapElements(arr, 2,0); Console.log (s2[0] === 'c'); Console.log (s2[2] === 'a');

下面是快速复制粘贴的typescript代码:

function swapElements(array: Array<any>, source: number, dest: number) {
  return source === dest
    ? array : array.map((item, index) => index === source
      ? array[dest] : index === dest 
      ? array[source] : item);
}

Flow

不是就地解决方案

let swap= (arr,i,j)=> arr.map((e,k)=> k-i ? (k-j ? e : arr[i]) : arr[j]);

让swap= (arr,i,j)=> arr.map((e,k)=> k-i ?(k-j ?E: arr[i]): arr[j]); //测试指数:3<->5 (= 'f'<->'d') 设a= ["a","b","c","d","e","f","g"]; 设b= swap(a,3,5); console.log(“\ n”,b); console.log(示例流:,交换(a, 3, 5) .reverse () . join (' - '));

就地解决方案

Let swap= (arr,i,j)=> {Let t=arr[i];arr[我]= arr [j];加勒比海盗[j] = t;返回arr} //测试指数:3<->5 (= 'f'<->'d') 设a= ["a","b","c","d","e","f","g"]; Console.log (swap(a,3,5)) console.log(示例流:,交换(a, 3, 5) .reverse () . join (' - '));

在这个解决方案中,我们使用“流模式”,这意味着swap函数返回数组作为结果-这允许轻松地继续使用dot处理。(比如reverse和join在片段中)