Есть ли более простой способ поменять два элемента в массиве?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
javascript
arrays
кругозор
источник
источник
a = [b, b = a][0];
как указал @Jan Хотя я все еще использую метод временных переменных, так как он кросс-языковой (например, C / C ++) ) и первый подход, который обычно приходит мне в голову.[ list[y], list[x] ] = [ list[x], list[y] ];
[arr[0], arr[1]] = [arr[1], arr[0]]
производить только[2, 1]
без остальной части массиваЕсли вам нужно одно выражение с использованием собственного javascript, помните, что возвращаемое значение из операции сращивания содержит элементы, которые были удалены.
Редактировать:
[0]
Необходимо в конце выражения , какArray.splice()
возвращает массив, и в этой ситуации , мы требуем , чтобы один элемент в возвращаемом массиве.источник
Это кажется хорошо ....
Hoverver с помощью
означает, что переменная b будет присутствовать для остальной части области. Это может привести к утечке памяти. Вряд ли, но все же лучше избегать.
Может быть, хорошая идея поместить это в Array.prototype.swap
который можно назвать как:
Это чистый подход, позволяющий избежать утечек памяти и СУХОГО .
источник
Array.prototype.swap = function (x,y) { if (x >= 0 && x < this.length && y >= 0 && y < this.length) { var b = this[x]; this[x] = this[y]; this[y] = b; } return this; };
По словам случайного человека из Metafilter , «последние версии Javascript позволяют вам делать свопы (между прочим) гораздо более аккуратно:»
Мои быстрые тесты показали, что этот код Pythonic отлично работает в версии JavaScript, используемой в настоящее время в «Google Apps Script» («.gs»). Увы, дальнейшие тесты показывают, что этот код выдает «Uncaught ReferenceError: Недопустимая левая часть в назначении». в любой версии JavaScript (".js") используется Google Chrome версии 24.0.1312.57 m.
источник
Ну, вам не нужно буферизовать оба значения - только одно:
источник
Вы можете поменять местами элементы в массиве следующим образом:
Смотрите следующий пример:
Примечание: это работает так же для обычных переменных
источник
[list[x], list[y]] = [list[y], list[x]];
.this[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
С числовыми значениями вы можете избежать временной переменной, используя побитовый xor
или арифметическая сумма (учитывая, что это работает, только если x + y меньше максимального значения для типа данных)
источник
list[y] = list[x] - list[x];
просто приравнивать кlist[y] = 0;
?Этого не было, когда задавался вопрос, но ES2015 ввел деструктуризацию массива, что позволило написать его следующим образом:
источник
[list[x], list[y]] = [list[y], list[x]];
Поменять местами два последовательных элемента массива
источник
Дайджест от http://www.greywyvern.com/?post=265
источник
swap(a, b)
функцию, вам не нужно беспокоиться о читабельности.как насчет Destructuring_assignment
который также может быть расширен до
источник
Рассмотрим такое решение без необходимости определять третью переменную:
Примечание: вы можете добавить дополнительные проверки, например, для длины массива. Это решение является изменяемым, поэтому
swap
функция не должна возвращать новый массив, она просто выполняет мутацию переданного массива.источник
arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
Вы можете поменять местами любое количество объектов или литералов, даже разных типов, используя простую функцию идентификации, например:
Для вашей проблемы:
Это работает в JavaScript, потому что он принимает дополнительные аргументы, даже если они не объявлены или не используются. Назначения и
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.Для двух или более элементов (фиксированное число)
Временная переменная не требуется!
Я думал просто позвонить
list.reverse()
.Но потом я понял, что своп будет работать только тогда, когда
list.length = x + y + 1
.Для переменного количества элементов
Я рассмотрел различные современные конструкции Javascript на этот счет, включая Map и map , но, к сожалению, ни одна из них не привела к созданию кода, который был бы более компактным или более быстрым, чем эта старомодная конструкция на основе циклов:
источник
Есть один интересный способ обмена:
(ES6 способ)
источник
var a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
источник
Вот одна строка, которая не мутирует
list
:let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(Использует языковые функции, недоступные в 2009 году, когда вопрос был опубликован!)
источник
Вот компактная версия меняет значение на i1 с i2 в обр
источник
Вот вариант, который сначала проверяет, существует ли индекс в массиве:
В настоящее время он просто вернется,
this
если индекс не существует, но вы можете легко изменить поведение при сбоеисточник
Поменяйте местами первый и последний элемент в массиве без временной переменной или метода обмена ES6 [a, b] = [b, a]
[a.pop(), ...a.slice(1), a.shift()]
источник
Решение Typescript, которое клонирует массив, а не изменяет существующий
источник
Просто для удовольствия, другой способ без использования какой-либо дополнительной переменной будет:
источник
Для краткости, вот уродливая версия с одной линией, которая только немного менее уродлива, чем вся эта конкатата и нарезка выше. Принятый ответ - действительно путь, и более читаемый.
Дано:
если вы хотите поменять местами значения двух индексов (a и b); тогда это будет сделано:
Например, если вы хотите поменять местами 3 и 5, вы можете сделать это следующим образом:
или
Оба дают одинаковый результат:
#splicehatersarepunks :)
источник
Если вы не хотите использовать временную переменную в ES5, это один из способов замены элементов массива.
источник
a.splice
возвращают массив с удаленными элементами. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...попробуйте эту функцию ...
источник
источник
С помощью ES6 это можно сделать так ...
Представьте, что у вас есть эти 2 массива ...
и вы хотите поменять местами первые значения:
и значение:
источник
Использование:
источник
Array
прототипа не было частью того, о чем просили - это может сбить с толку больше, чем принесет пользу.Если нужно поменять местами только первый и последний элементы:
источник
[1, 2, 3] => [3, 1, 2]
вместо[1, 2, 3] => [3, 2, 1]
.