ken*_*ken 199 javascript arrays
有没有更简单的方法来交换数组中的两个元素?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
Run Code Online (Sandbox Code Playgroud)
tva*_*son 343
您只需要一个临时变量.
var b = list[y];
list[y] = list[x];
list[x] = b;
Run Code Online (Sandbox Code Playgroud)
10年后编辑劫持最佳答案,我们正在采用大量ES6:
给定数组arr = [1,2,3,4]
,您可以在一行中交换值,如下所示:
[arr[0], arr[1]] = [arr[1], arr[0]];
Run Code Online (Sandbox Code Playgroud)
这会产生数组[2,1,3,4]
.这是解构分配.
ken*_*bec 107
如果您想要一个表达式,使用本机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"
Run Code Online (Sandbox Code Playgroud)
编辑:
的[0]
是在作为表达式的结尾必要Array.splice()
返回一个数组,并且在这种情况下,我们所需要的返回数组中的单个元件.
Ste*_*fan 71
这似乎没问题....
var b = list[y];
list[y] = list[x];
list[x] = b;
Run Code Online (Sandbox Code Playgroud)
Howerver使用
var b = list[y];
Run Code Online (Sandbox Code Playgroud)
表示将在范围的其余部分存在b变量.这可能会导致内存泄漏.不太可能,但更好的避免.
将它放入Array.prototype.swap可能是一个好主意
Array.prototype.swap = function (x,y) {
var b = this[x];
this[x] = this[y];
this[y] = b;
return this;
}
Run Code Online (Sandbox Code Playgroud)
可以这样称为:
list.swap( x, y )
Run Code Online (Sandbox Code Playgroud)
这是避免内存泄漏和DRY的干净方法.
Dav*_*ary 50
根据Metafilter的一些随机人士的说法,"Javascript的最新版本允许你更加巧妙地进行交换(以及其他事情):"
[ list[x], list[y] ] = [ list[y], list[x] ];
Run Code Online (Sandbox Code Playgroud)
我的快速测试表明,这个Pythonic代码在目前用于"Google Apps Script"(".go")的JavaScript版本中运行良好.唉,进一步的测试显示这段代码给出了"未捕获的ReferenceError:赋值中的左侧无效".在谷歌浏览器版本24.0.1312.57 m使用的任何版本的JavaScript(".js").
Mar*_*ell 28
好吧,你不需要缓冲两个值 - 只有一个:
var tmp = list[x];
list[x] = list[y];
list[y] = tmp;
Run Code Online (Sandbox Code Playgroud)
Jan*_*Jan 21
您可以通过以下方式交换数组中的元素:
list[x] = [list[y],list[y]=list[x]][0]
Run Code Online (Sandbox Code Playgroud)
请参阅以下示例:
list = [1,2,3,4,5]
list[1] = [list[3],list[3]=list[1]][0]
//list is now [1,4,3,2,5]
Run Code Online (Sandbox Code Playgroud)
注意:对于常规变量,它的工作方式相同
var a=1,b=5;
a = [b,b=a][0]
Run Code Online (Sandbox Code Playgroud)
Jak*_*old 18
使用数字值,您可以通过使用按位xor来避免临时变量
list[x] = list[x] ^ list[y];
list[y] = list[y] ^ list[x];
list[x] = list[x] ^ list[y];
Run Code Online (Sandbox Code Playgroud)
或算术和(注意这仅在x + y小于数据类型的最大值时才有效)
list[x] = list[x] + list[y];
list[y] = list[x] - list[y];
list[x] = list[x] - list[y];
Run Code Online (Sandbox Code Playgroud)
dir*_*dig 16
当提出问题时,这不存在,但ES2015引入了数组解构,允许您按如下方式编写:
let a = 1, b = 2;
// a: 1, b: 2
[a, b] = [b, a];
// a: 2, b: 1
Run Code Online (Sandbox Code Playgroud)
小智 13
摘自http://www.greywyvern.com/?post=265
var a = 5, b = 9;
b = (a += b -= a) - b;
alert([a, b]); // alerts "9, 5"
Run Code Online (Sandbox Code Playgroud)
小智 13
交换两个连续的数组元素
array.splice(IndexToSwap,2,array[IndexToSwap+1],array[IndexToSwap]);
Run Code Online (Sandbox Code Playgroud)
ROR*_*ROR 10
var arr = [1, 2, 3, 4]
[arr[index1], arr[index2]] = [arr[index2], arr[index1]]
Run Code Online (Sandbox Code Playgroud)
这也可以扩展到
[src order elements] => [dest order elements]
Run Code Online (Sandbox Code Playgroud)
您可以使用这样的简单标识函数交换任意数量的对象或文字,甚至是不同类型的文字:
var swap = function (x){return x};
b = swap(a, a=b);
c = swap(a, a=b, b=c);
Run Code Online (Sandbox Code Playgroud)
对于你的问题:
var swap = function (x){return x};
list[y] = swap(list[x], list[x]=list[y]);
Run Code Online (Sandbox Code Playgroud)
这适用于JavaScript,因为即使未声明或使用它们,它也会接受其他参数.a=b
在a
传递给函数之后发生的赋值等.
考虑这样的解决方案而无需定义第三个变量:
function swap(arr, from, to) {
arr.splice(from, 1, arr.splice(to, 1, arr[from])[0]);
}
var letters = ["a", "b", "c", "d", "e", "f"];
swap(letters, 1, 4);
console.log(letters); // ["a", "e", "c", "d", "b", "f"]
Run Code Online (Sandbox Code Playgroud)
注意:您可能希望添加其他检查,例如数组长度.这个解决方案是可变的,所以swap
函数不需要返回一个新的数组,它只是通过传入的数组进行突变.
[list[y], list[x]] = [list[x], list[y]];
Run Code Online (Sandbox Code Playgroud)
不需要临时变量!
我在考虑简单地打电话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]);
Run Code Online (Sandbox Code Playgroud)
<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: </td> <td><code></code></td></tr>
</table>
Run Code Online (Sandbox Code Playgroud)
这是一个不会变异的单行list
:
let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(使用 2009 年发布问题时不可用的语言功能!)
有一种有趣的交换方式:
var a = 1;
var b = 2;
[a,b] = [b,a];
Run Code Online (Sandbox Code Playgroud)
(ES6方式)