JavaScript交换数组元素

2020/10/11 16:41 · javascript ·  · 0评论

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

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

您只需要一个临时变量。

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

10年后,我们大量采用了ES6,从而编辑劫持性最高答案:

给定array arr = [1,2,3,4],您现在可以在一行中交换值,如下所示:

[arr[0], arr[1]] = [arr[1], arr[0]];

这将产生数组[2,1,3,4]这是破坏性的任务

如果要使用本机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"

编辑:

[0]是在表达的端部必要Array.splice()的阵列的回报,并且在这种情况下,我们所需要的返回数组中的单个元件。

好像还可以

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的干净方法

根据Metafilter上的某个随机人士的说法,“ Java的最新版本使您可以更巧妙地进行交换(以及其他操作):”

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

我的快速测试表明,这种Pythonic代码在“ Google Apps脚本”(“ .gs”)当前使用的JavaScript版本中效果很好。further,进一步的测试表明此代码给出了“ Uncaught ReferenceError:分配中的无效左侧”。Google Chrome版本24.0.1312.57 m使用任何版本的JavaScript(“ .js”)。

好吧,您不需要缓存两个值-仅一个:

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

您可以通过以下方式交换数组中的元素:

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]

注意:它与常规变量的工作方式相同

var a=1,b=5;
a = [b,b=a][0]

提出问题时不存在此问题,但是ES2015引入了数组解构,使您可以按以下方式编写它:

let a = 1, b = 2;
// a: 1, b: 2
[a, b] = [b, a];
// a: 2, b: 1

使用数字值时,可以通过按位异或来避免使用临时变量

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

交换数组的两个连续元素

array.splice(IndexToSwap,2,array[IndexToSwap+1],array[IndexToSwap]);

摘自http://www.greywyvern.com/?post=265

var a = 5, b = 9;    
b = (a += b -= a) - b;    
alert([a, b]); // alerts "9, 5"

Destructuring_assignment呢

var arr = [1, 2, 3, 4]
[arr[index1], arr[index2]] = [arr[index2], arr[index1]]

也可以扩展到

[src order elements] => [dest order elements]

考虑这种解决方案,而无需定义第三个变量:

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

注意:您可能想要添加其他检查,例如数组长度。该解决方案是可变的,因此swap函数不需要返回新数组,只需对传入的数组进行突变即可。

您可以使用以下简单的标识函数交换任意数量的对象或文字,甚至不同类型的文字:

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传递到函数后发生

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

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

无需临时变量!

我在想简单地打电话list.reverse()

但后来我意识到,只有在时,它才可以作为交换项
list.length = x + y + 1

对于可变数量的元素

为此,我研究了各种现代Javascript构造,包括Mapmap,但是遗憾的是,没有一个代码比这种老式的基于循环的构造更紧凑或更快速:

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>

有一种有趣的交换方式:

var a = 1;
var b = 2;
[a,b] = [b,a];

(ES6方式)

这是一个不会变异的单线list

let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})

(使用发布问题时2009年不可用的语言功能!)

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

这是一个紧凑版本,将i1的值与arr中的i2交换

arr.slice(0,i1).concat(arr[i2],arr.slice(i1+1,i2),arr[i1],arr.slice(i2+1))

下面是一个变体,它首先检查数组中是否存在索引:

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

当前,this如果索引不存在,它将仅返回,但是您可以轻松地修改失败的行为

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

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 ]

Typescript解决方案,可克隆数组而不是对现有数组进行突变

export function swapItemsInArray<T>(items: T[], indexA: number, indexB: number): T[] {
  const itemA = items[indexA];

  const clone = [...items];

  clone[indexA] = clone[indexB];
  clone[indexB] = itemA;

  return clone;
}

为了简洁起见,这是一个丑陋的单线版本,仅比上面所有concat和slicing的丑陋程度要小一些。公认的答案确实是一种使方法更具可读性的方法。

鉴于:

var foo = [ 0, 1, 2, 3, 4, 5, 6 ];

如果要交换两个索引(a和b)的值;然后这样做:

foo.splice( a, 1, foo.splice(b,1,foo[a])[0] );

例如,如果要交换3和5,则可以这样进行:

foo.splice( 3, 1, foo.splice(5,1,foo[3])[0] );

要么

foo.splice( 5, 1, foo.splice(3,1,foo[5])[0] );

两者产生相同的结果:

console.log( foo );
// => [ 0, 1, 2, 5, 4, 3, 6 ]

#splicehatersarepunks :)

交换没有临时变量或ES6交换方法的数组中的第一个和最后一个元素[a,b] = [b,a]

[a.pop(), ...a.slice(1), a.shift()]

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);
var arr = [1, 2];
arr.splice(0, 2, arr[1], arr[0]);
console.log(arr); //[2, 1]
function moveElement(array, sourceIndex, destinationIndex) {
    return array.map(a => a.id === sourceIndex ? array.find(a => a.id === destinationIndex): a.id === destinationIndex ? array.find(a => a.id === sourceIndex) : a )
}
let arr = [
{id: "1",title: "abc1"},
{id: "2",title: "abc2"},
{id: "3",title: "abc3"},
{id: "4",title: "abc4"}];

moveElement(arr, "2","4");

不到位

let swap= (arr,i,j)=> arr.map((e,k)=> k-i ? (k-j ? e : arr[i]) : arr[j]);

并就位

在此解决方案中(不是原地),我们使用“流模式”,这意味着swap函数将返回数组作为结果-这允许轻松地使用点继续处理.(如代码join段中)

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

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]

试试这个功能...

$(document).ready(function () {
        var pair = [];
        var destinationarray = ['AAA','BBB','CCC'];

        var cityItems = getCityList(destinationarray);
        for (var i = 0; i < cityItems.length; i++) {
            pair = [];
            var ending_point = "";
            for (var j = 0; j < cityItems[i].length; j++) {
                pair.push(cityItems[i][j]);
            }
            alert(pair);
            console.log(pair)
        }

    });
    function getCityList(inputArray) {
        var Util = function () {
        };

        Util.getPermuts = function (array, start, output) {
            if (start >= array.length) {
                var arr = array.slice(0);
                output.push(arr);
            } else {
                var i;

                for (i = start; i < array.length; ++i) {
                    Util.swap(array, start, i);
                    Util.getPermuts(array, start + 1, output);
                    Util.swap(array, start, i);
                }
            }
        }

        Util.getAllPossiblePermuts = function (array, output) {
            Util.getPermuts(array, 0, output);
        }

        Util.swap = function (array, from, to) {
            var tmp = array[from];
            array[from] = array[to];
            array[to] = tmp;
        }
        var output = [];
        Util.getAllPossiblePermuts(inputArray, output);
        return output;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

使用ES6可以做到这一点...

假设您有这2个阵列...

const a = ["a", "b", "c", "d", "e"];
const b = [5, 4, 3, 2, 1];

并且您想交换第一个值:

const [a0] = a;
a[0] = b[0];
b[0] = a0;

和价值:

a; //[5, "b", "c", "d", "e"]
b; //["a", 4, 3, 2, 1]
本文地址:http://javascript.askforanswer.com/javascriptjiaohuanshuzuyuansu.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!