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: </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);