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

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

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

Ответы [ 27 ]

297 голосов
/ 16 мая 2009

Вам нужна только одна временная переменная.

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

Редактировать угонять топ-ответ 10 лет спустя с большим количеством принятия ES6 под нашими поясами:

Учитывая массив arr = [1,2,3,4], вы можете поменять значения в одну строку теперь так:

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

Это даст массив [2,1,3,4]. Это деструктивное задание .

104 голосов
/ 16 мая 2009

Если вы хотите одно выражение, используя нативный 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"

Edit:

[0] необходимо в конце выражения, поскольку Array.splice() возвращает массив, и в этой ситуации нам требуется один элемент в возвращаемом массиве.

66 голосов
/ 16 мая 2009

Кажется, все в порядке ....

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

Hoverver используя

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 .

45 голосов
/ 14 февраля 2013

Согласно какой-то случайный человек на Метафильтре , «Последние версии Javascript позволяют вам делать свопы (между прочим) гораздо более аккуратно:«

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

Мои быстрые тесты показали, что этот Pythonic код прекрасно работает в версии JavaScript в настоящее время используется в «Сценарии Google Apps» («.gs»). Увы, дальнейшие тесты показывают, что этот код выдает «Uncaught ReferenceError: Недопустимая левая часть в назначении». в какая бы версия JavaScript (".js") не использовалась Google Chrome Версия 24.0.1312.57 м.

29 голосов
/ 16 мая 2009

Ну, вам не нужно буферизовать оба значения - только одно:

var tmp = list[x];
list[x] = list[y];
list[y] = tmp;
21 голосов
/ 27 февраля 2014

Вы можете поменять местами элементы в массиве следующим образом:

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]
18 голосов
/ 16 мая 2009

С числовыми значениями вы можете избежать временной переменной, используя побитовое xor

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];
15 голосов
/ 10 марта 2017

Этого не было, когда задавался вопрос, но ES2015 ввел деструктуризацию массива, что позволило записать его следующим образом:

let a = 1, b = 2;
// a: 1, b: 2
[a, b] = [b, a];
// a: 2, b: 1
14 голосов
/ 08 марта 2011

Дайджест от http://www.greywyvern.com/?post=265

var a = 5, b = 9;    
b = (a += b -= a) - b;    
alert([a, b]); // alerts "9, 5"
13 голосов
/ 09 декабря 2012

Поменять местами два последовательных элемента массива

array.splice(IndexToSwap,2,array[IndexToSwap+1],array[IndexToSwap]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...