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

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

当前回答

如果你不想在ES5中使用临时变量,这是交换数组元素的一种方法。

var swapArrayElements = function (a, x, y) {
  if (a.length === 1) return a;
  a.splice(y, 1, a.splice(x, 1, a[y])[0]);
  return a;
};

swapArrayElements([1, 2, 3, 4, 5], 1, 3); //=> [ 1, 4, 3, 2, 5 ]

其他回答

这似乎还可以....

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

不管用

var b = list[y];

意味着变量b将在作用域的其余部分出现。这可能会导致内存泄漏。不太可能,但还是最好避免。

也许把这个放到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的干净方法。

就地交换

// array methods
function swapInArray(arr, i1, i2){
    let t = arr[i1];
    arr[i1] = arr[i2];
    arr[i2] = t;
}

function moveBefore(arr, el){
    let ind = arr.indexOf(el);
    if(ind !== -1 && ind !== 0){
        swapInArray(arr, ind, ind - 1);
    }
}

function moveAfter(arr, el){
    let ind = arr.indexOf(el);
    if(ind !== -1 && ind !== arr.length - 1){
        swapInArray(arr, ind + 1, ind);
    }
}

// dom methods
function swapInDom(parentNode, i1, i2){
    parentNode.insertBefore(parentNode.children[i1], parentNode.children[i2]);
}

function getDomIndex(el){
    for (let ii = 0; ii < el.parentNode.children.length; ii++){
        if(el.parentNode.children[ii] === el){
            return ii;
        }
    }
}

function moveForward(el){
    let ind = getDomIndex(el);
    if(ind !== -1 && ind !== 0){
        swapInDom(el.parentNode, ind, ind - 1);
    }
}

function moveBackward(el){
    let ind = getDomIndex(el);
    if(ind !== -1 && ind !== el.parentNode.children.length - 1){
        swapInDom(el.parentNode, ind + 1, ind);
    }
}

对于数值,可以使用按位的异或来避免临时变量

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];

只是为了好玩,另一种不使用任何额外变量的方法是:

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]

对于两个或多个元素(固定数量)

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

不需要临时变量!

我在考虑简单地调用list.reverse()。 但后来我意识到它只会作为交换列表。长度= 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:&nbsp;</td> <td><code></code></td></tr> </table>