有没有一种更简单的方法来交换数组中的两个元素?
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[y], list[x]] = [list[x], list[y]];
无需临时变量!
我考虑过直接调用 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>
swap(a, b)
函数中,就不需要担心可读性的问题了。 - AccidentalTaylorExpansion您可以使用一个简单的标识函数来交换任意数量的对象或文字,甚至是不同类型的:
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]);
a=b
等在将 a
传入函数后发生。list[y] = (function(x){return x})(list[x],list[x]=list[y]);
。或者,如果您对ES6(JS的下一个版本)感兴趣,那么它非常容易:[list[x], list[y]] = [list[y], list[x]
。我很高兴他们在JavaScript的下一个版本中添加了一些更多的功能和基于类的方面。 - Claudia有一种有趣的交换方式:
var a = 1;
var b = 2;
[a,b] = [b,a];
(ES6方式)
var a = [7, 8, 9, 10], i = 2, j = 3;
[a[i], a[j]] = [a[j], a[i]];
- caub下面是一个不改变 list
的一行代码:
let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(使用了2009年提问时还不存在的语言特性!)
不是一个现成的解决方案:
let swap = (arr, i, j) => arr.map((e, k) => k-i ? (k-j ? e : arr[i]) : arr[j]);
let swap = (arr, i, j) => arr.map((e, k) => k-i ? (k-j ? e : arr[i]) : arr[j]);
// Test index: 3<->5 (= 'f'<->'d')
let a = ["a", "b", "c", "d", "e", "f", "g"];
let b = swap(a, 3, 5);
console.log(a, "\n", b);
console.log('Example Flow:', swap(a, 3, 5).reverse().join('-'));
而且有一个原地解决方案:
let swap = (arr, i, j) => {let t = arr[i]; arr[i] = arr[j]; arr[j] = t; return arr}
// Test index: 3<->5 (= 'f'<->'d')
let a = ["a", "b", "c", "d", "e", "f", "g"];
console.log(swap(a, 3, 5))
console.log('Example Flow:', swap(a, 3, 5).reverse().join('-'));
swap
函数返回一个数组作为结果。这使得它可以轻松地使用点.
(就像片段中的reverse
和join
)继续处理。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];
var arr = [1, 2];
arr.splice(0, 2, arr[1], arr[0]);
console.log(arr); //[2, 1]
arr.slice(0, i1).concat(arr[i2], arr.slice(i1 + 1, i2), arr[i1], arr.slice(i2 + 1))
with()
可以在一行中完成:list.with(x,list[y]).with(y,list[x])
看看我的答案和示例! - XMehdi01with()
可以在一行中完成:list.with(x,list[y]).with(y,list[x])
看看我的回答,附带一个示例! - undefined