Элементы массива подкачки Javascript - PullRequest
172 голосов
/ 16 мая 2009

Есть ли более простой способ поменять два элемента в массиве?

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

Ответы [ 27 ]

9 голосов
/ 04 января 2018

как насчет Destructuring_assignment

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

, который также может быть расширен до

[src order elements] => [dest order elements]
7 голосов
/ 16 декабря 2013

Вы можете поменять любое количество объектов или литералов, даже разных типов, используя простую функцию идентификации, такую ​​как:

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.

6 голосов
/ 24 апреля 2017

Для двух или более элементов (фиксированное число)

[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:&nbsp;</td> <td><code></code></td></tr>
</table>
5 голосов
/ 07 сентября 2018

Рассмотрим такое решение без необходимости определять третью переменную:

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 не нужно возвращать новый массив, она просто выполняет мутацию в массиве, переданном в.

5 голосов
/ 18 февраля 2014

Существует один интересный способ обмена:

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

(ES6 way)

4 голосов
/ 18 июня 2011
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];
3 голосов
/ 09 сентября 2017

Вот одна строка, которая не мутирует list:

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

(Используются языковые функции, недоступные в 2009 году, когда был опубликован вопрос!)

1 голос
/ 16 марта 2013

Вот компактная версия меняет значение в i1 на i2 в arr

arr.slice(0,i1).concat(arr[i2],arr.slice(i1+1,i2),arr[i1],arr.slice(i2+1))
0 голосов
/ 03 апреля 2017

Просто для удовольствия, другой способ без использования каких-либо дополнительных переменных будет:

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]
0 голосов
/ 21 июня 2018

попробуйте эту функцию ...

$(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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...