是否有更简单的方法来交换数组中的两个元素?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
是否有更简单的方法来交换数组中的两个元素?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
当前回答
对于数值,可以使用按位的异或来避免临时变量
list[x] = list[x] ^ list[y];
list[y] = list[y] ^ list[x];
list[x] = list[x] ^ list[y];
或算术和(注意,这仅适用于x + y小于数据类型的最大值时)
list[x] = list[x] + list[y];
list[y] = list[x] - list[y];
list[x] = list[x] - list[y];
其他回答
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在片段中)
Var arr = [1,2]; 加勒比海盗。拼接(0,2,arr[1], arr[0]); console.log (arr);/ / (2, 1)
只是为了好玩,另一种不使用任何额外变量的方法是:
Var arr = [1,2,3,4,5,6,7,8,9]; //交换索引0和2 arr (arr)。长度]= arr[0];//将idx1复制到数组的末尾 Arr [0] = Arr [2];//复制idx2到idx1 Arr [2] = Arr [Arr .length-1];//复制idx1到idx2 arr.length——;//删除idx1(被添加到数组的末尾) Console.log (arr);// -> [3,2,1,4,5,6,7,8,9]
如果你想要一个单一的表达式,使用本地javascript, 记住,拼接操作的返回值 包含已删除的元素。
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"
编辑:
当array. splice()返回一个数组时,表达式末尾的[0]是必要的,在这种情况下,我们需要返回数组中的单个元素。
那么Destructuring_assignment呢
var arr = [1, 2, 3, 4]
[arr[index1], arr[index2]] = [arr[index2], arr[index1]]
还可以推广到
[src order elements] => [dest order elements]