Czy istnieje prostszy sposób na zamianę dwóch elementów w tablicy?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
javascript
arrays
rozpoznać
źródło
źródło
a = [b, b = a][0];
jak wskazał @Jan. Mimo to wciąż używam podejścia do zmiennych tymczasowych, ponieważ jest ono wielojęzyczne (np. C / C ++ ) i pierwsze podejście, które zwykle przychodzi mi na myśl.[ list[y], list[x] ] = [ list[x], list[y] ];
[arr[0], arr[1]] = [arr[1], arr[0]]
produkować tylko[2, 1]
bez reszty zestawuJeśli chcesz użyć pojedynczego wyrażenia, używając natywnego języka JavaScript, pamiętaj, że wartość zwracana z operacji łączenia zawiera elementy, które zostały usunięte.
Edytować:
Jest
[0]
to konieczne na końcu wyrażenia, ponieważArray.splice()
zwraca tablicę, aw tej sytuacji wymagamy pojedynczego elementu w zwróconej tablicy.źródło
To wydaje się ok ....
Howerver używa
oznacza b że do końca zakresu będzie obecna zmienna . Może to potencjalnie doprowadzić do wycieku pamięci. Mało prawdopodobne, ale nadal lepiej go unikać.
Może dobrym pomysłem jest umieszczenie tego w Array.prototype.swap
które można nazwać:
Jest to czyste podejście zarówno do unikania wycieków pamięci, jak i DRY .
źródło
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; };
Według pewnej przypadkowej osoby z Metafilter , „Najnowsze wersje Javascript pozwalają na zamianę (między innymi) o wiele ładniej:”
Moje szybkie testy wykazały, że ten kod Python działa świetnie w wersji JavaScript używanej obecnie w „Google Apps Script” („.gs”). Niestety, dalsze testy pokazują, że ten kod daje komunikat „Nieprzechwycony błąd referencyjny: Nieprawidłowe przypisanie lewej strony”. w dowolnej wersji JavaScript („.js”) używanej przez Google Chrome w wersji 24.0.1312.57 m.
źródło
Nie musisz buforować obu wartości - tylko jedna:
źródło
Możesz zamieniać elementy w tablicy w następujący sposób:
Zobacz następujący przykład:
Uwaga: działa tak samo dla zmiennych regularnych
źródło
[list[x], list[y]] = [list[y], list[x]];
.this[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
Za pomocą wartości liczbowych można uniknąć zmiennej tymczasowej, stosując xor bitowy
lub suma arytmetyczna (zauważając, że działa to tylko wtedy, gdy x + y jest mniejsza niż maksymalna wartość dla typu danych)
źródło
list[y] = list[x] - list[x];
równalist[y] = 0;
?Nie istniało to, gdy pytanie zostało zadane, ale ES2015 wprowadził destrukcję tablicy, umożliwiając zapisanie jej w następujący sposób:
źródło
[list[x], list[y]] = [list[y], list[x]];
Aby zamienić dwa kolejne elementy tablicy
źródło
Podsumowanie ze strony http://www.greywyvern.com/?post=265
źródło
swap(a, b)
funkcją, nie musisz się martwić o czytelność.co z podziałem_rozwoju
który można również rozszerzyć na
źródło
Rozważ takie rozwiązanie bez potrzeby definiowania trzeciej zmiennej:
Uwaga: Możesz chcieć dodać dodatkowe kontrole, na przykład dla długości tablicy. To rozwiązanie jest modyfikowalne, więc
swap
funkcja nie musi zwracać nowej tablicy, po prostu dokonuje mutacji w stosunku do przekazanej tablicy.źródło
arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
Możesz zamienić dowolną liczbę obiektów lub literałów, nawet różnego rodzaju, używając prostej funkcji tożsamości, takiej jak ta:
Twój problem:
Działa to w JavaScript, ponieważ akceptuje dodatkowe argumenty, nawet jeśli nie są zadeklarowane ani użyte. Przydziały
a=b
itp. Zdarzają się poa
przekazaniu do funkcji.źródło
list[y] = (function(x){return x})(list[x],list[x]=list[y]);
. Lub, jeśli jesteś zainteresowany w ES6 (następna wersja JS), to jest szalenie proste:[list[x], list[y]] = [list[y], list[x]
. Cieszę się, że dodają bardziej funkcjonalne i oparte na klasach aspekty do następnej wersji JavaScript.Dla dwóch lub więcej elementów (stała liczba)
Nie jest wymagana zmienna tymczasowa!
Myślałem o zwykłym dzwonieniu
list.reverse()
.Ale potem zdałem sobie sprawę, że to zadziała jako zamiana tylko wtedy, gdy
list.length = x + y + 1
.Dla zmiennej liczby elementów
W tym celu przyjrzałem się różnym współczesnym konstrukcjom JavaScript, w tym Map i Map , ale niestety żadna z nich nie zaowocowała kodem, który byłby bardziej zwarty lub szybszy niż ta staromodna konstrukcja oparta na pętli:
źródło
Jest jeden interesujący sposób zamiany:
(Sposób ES6)
źródło
var a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
źródło
Oto linijka, która nie mutuje
list
:let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(Wykorzystuje funkcje językowe niedostępne w 2009 roku, kiedy pytanie zostało opublikowane!)
źródło
Oto kompaktowa wersja zamienia wartość na i1 z i2 w arr
źródło
Oto odmiana, która najpierw sprawdza, czy indeks istnieje w tablicy:
Obecnie zwróci tylko,
this
jeśli indeks nie istnieje, ale można łatwo zmodyfikować zachowanie w przypadku niepowodzeniaźródło
Zamień pierwszy i ostatni element w tablicy bez zmiennej tymczasowej lub metody zamiany ES6 [a, b] = [b, a]
[a.pop(), ...a.slice(1), a.shift()]
źródło
Rozwiązanie maszynopisu, które klonuje tablicę zamiast mutować istniejącą
źródło
Dla zabawy, innym sposobem bez użycia dodatkowej zmiennej byłoby:
źródło
Dla zwięzłości, oto brzydka wersja jednoliniowa, która jest tylko nieco mniej brzydka niż wszystkie te konkat i krojenie powyżej. Przyjęta odpowiedź jest naprawdę drogą i jest bardziej czytelna.
Dany:
jeśli chcesz zamienić wartości dwóch indeksów (a i b); to by to zrobiło:
Na przykład, jeśli chcesz zamienić 3 i 5, możesz to zrobić w ten sposób:
lub
Oba dają ten sam wynik:
#splicehatersarepunks :)
źródło
Jeśli nie chcesz używać zmiennej temp w ES5, jest to jeden ze sposobów zamiany elementów tablicy.
źródło
a.splice
zwraca tablicę z usuniętymi elementami. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…wypróbuj tę funkcję ...
źródło
źródło
Za pomocą ES6 można to zrobić w ten sposób ...
Wyobraź sobie, że masz te 2 tablice ...
i chcesz zamienić pierwsze wartości:
i wartość:
źródło
Stosowanie:
źródło
Array
prototypu nie było częścią tego, o co prosiło - może bardziej pomieszać, niż zrobić.W razie potrzeby zamień tylko pierwszy i ostatni element:
źródło
[1, 2, 3] => [3, 1, 2]
zamiast[1, 2, 3] => [3, 2, 1]
.