Gibt es eine einfachere Möglichkeit, zwei Elemente in einem Array auszutauschen?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
javascript
arrays
Ken
quelle
quelle
a = [b, b = a][0];
erzielt werden, ohne den aktuellen Bereich mit einer temporären Variablen zu verschmutzen: wie von @Jan hervorgehoben. Obwohl ich immer noch den temporären Variablenansatz als sprachübergreifend verwende (z. B. C / C ++) ) und der erste Ansatz, der mir normalerweise in den Sinn kommt.[ list[y], list[x] ] = [ list[x], list[y] ];
[arr[0], arr[1]] = [arr[1], arr[0]]
Produzieren Sie nur[2, 1]
ohne den Rest des ArraysWenn Sie einen einzelnen Ausdruck mit nativem Javascript verwenden möchten, denken Sie daran, dass der Rückgabewert einer Spleißoperation die Elemente enthält, die entfernt wurden.
Bearbeiten:
Das
[0]
ist am Ende des Ausdrucks erforderlich, da esArray.splice()
ein Array zurückgibt. In dieser Situation benötigen wir das einzelne Element im zurückgegebenen Array.quelle
Das scheint in Ordnung zu sein ....
Wie auch immer mit
bedeutet, dass eine b- Variable für den Rest des Bereichs vorhanden sein wird. Dies kann möglicherweise zu einem Speicherverlust führen. Unwahrscheinlich, aber immer noch besser zu vermeiden.
Vielleicht eine gute Idee, dies in Array.prototype.swap einzufügen
was wie folgt genannt werden kann:
Dies ist ein sauberer Ansatz, um sowohl Speicherlecks als auch DRY zu vermeiden .
quelle
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; };
Laut einer zufälligen Person auf Metafilter "können Sie in neueren Versionen von Javascript (unter anderem) viel sauberer Swaps durchführen:"
Meine schnellen Tests haben gezeigt, dass dieser Pythonic-Code in der Version von JavaScript, die derzeit in "Google Apps Script" (".gs") verwendet wird, hervorragend funktioniert. Leider zeigen weitere Tests, dass dieser Code einen "Nicht erfassten Referenzfehler: Ungültige linke Seite in Zuweisung" ergibt. in welcher Version von JavaScript (".js") von Google Chrome Version 24.0.1312.57 m verwendet wird.
quelle
Nun, Sie müssen nicht beide Werte puffern - nur einen:
quelle
Sie können Elemente in einem Array folgendermaßen austauschen:
Siehe folgendes Beispiel:
Hinweis: Dies funktioniert für reguläre Variablen genauso
quelle
[list[x], list[y]] = [list[y], list[x]];
.this[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
Mit numerischen Werten können Sie eine temporäre Variable vermeiden, indem Sie bitweises xor verwenden
oder eine arithmetische Summe (wobei zu beachten ist, dass dies nur funktioniert, wenn x + y kleiner als der Maximalwert für den Datentyp ist)
quelle
list[y] = list[x] - list[x];
gleichbedeutend mitlist[y] = 0;
?Dies war nicht vorhanden, als die Frage gestellt wurde, aber ES2015 führte die Array-Destrukturierung ein, sodass Sie sie wie folgt schreiben können:
quelle
[list[x], list[y]] = [list[y], list[x]];
Zwei aufeinanderfolgende Elemente des Arrays austauschen
quelle
Digest von http://www.greywyvern.com/?post=265
quelle
swap(a, b)
Funktion einbinden, müssen Sie sich keine Gedanken über die Lesbarkeit machen.Was ist mit Destructuring_assignment?
die auch erweitert werden kann
quelle
Betrachten Sie eine solche Lösung, ohne die dritte Variable definieren zu müssen:
Hinweis: Möglicherweise möchten Sie zusätzliche Überprüfungen hinzufügen, z. B. für die Arraylänge. Diese Lösung ist veränderbar, sodass die
swap
Funktion kein neues Array zurückgeben muss, sondern nur eine Mutation über das übergebene Array.quelle
arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
Mit einer einfachen Identitätsfunktion wie der folgenden können Sie eine beliebige Anzahl von Objekten oder Literalen, auch unterschiedlicher Art, austauschen:
Für Ihr Problem:
Dies funktioniert in JavaScript, da zusätzliche Argumente akzeptiert werden, auch wenn sie nicht deklariert oder verwendet werden. Die Zuweisungen
a=b
usw. erfolgen, nachdem siea
an die Funktion übergeben wurden.quelle
list[y] = (function(x){return x})(list[x],list[x]=list[y]);
. Oder wenn Sie an ES6 (nächste Version von JS) interessiert sind, ist es wahnsinnig einfach :[list[x], list[y]] = [list[y], list[x]
. Ich bin so froh, dass sie der nächsten Version von JavaScript einige weitere funktionale und klassenbasierte Aspekte hinzufügen.Für zwei oder mehr Elemente (feste Nummer)
Keine temporäre Variable erforderlich!
Ich dachte darüber nach, einfach anzurufen
list.reverse()
.Aber dann wurde mir klar, dass es nur dann als Tausch funktionieren würde
list.length = x + y + 1
.Für variable Anzahl von Elementen
Ich habe verschiedene moderne Javascript-Konstruktionen zu diesem Zweck untersucht, einschließlich Map und Map , aber leider hat keine zu einem Code geführt, der kompakter oder schneller war als diese altmodische, schleifenbasierte Konstruktion:
quelle
Es gibt eine interessante Art zu tauschen:
(ES6 Weg)
quelle
var a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
quelle
Hier ist ein Einzeiler, der nicht mutiert
list
:let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(Verwendet Sprachfunktionen, die 2009 nicht verfügbar waren, als die Frage gestellt wurde!)
quelle
Hier ist eine kompakte Version, die den Wert bei i1 gegen i2 in arr austauscht
quelle
Hier ist eine Variante, die zuerst prüft, ob der Index im Array vorhanden ist:
Derzeit wird nur zurückgegeben,
this
wenn der Index nicht vorhanden ist. Sie können das Verhalten jedoch bei einem Fehler leicht ändernquelle
Tauschen Sie das erste und letzte Element in einem Array ohne temporäre Variable oder ES6-Swap-Methode aus [a, b] = [b, a]
[a.pop(), ...a.slice(1), a.shift()]
quelle
Typoskript-Lösung, die das Array klont, anstatt das vorhandene zu mutieren
quelle
Nur zum Spaß wäre ein anderer Weg ohne zusätzliche Variable:
quelle
Der Kürze halber ist hier die hässliche Einzeiler-Version, die nur geringfügig weniger hässlich ist als all das Concat und Slicing oben. Die akzeptierte Antwort ist wirklich der richtige Weg und lesbarer.
Gegeben:
wenn Sie die Werte zweier Indizes (a und b) tauschen möchten; dann würde das es tun:
Wenn Sie beispielsweise die 3 und 5 tauschen möchten, können Sie dies folgendermaßen tun:
oder
Beide ergeben das gleiche Ergebnis:
#splicehatersarepunks :)
quelle
Wenn Sie in ES5 keine temporäre Variable verwenden möchten, können Sie auf diese Weise Array-Elemente austauschen.
quelle
a.splice
ein Array mit den entfernten Elementen zurückgeben. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Probieren Sie diese Funktion aus ...
quelle
quelle
Mit ES6 ist das möglich ...
Stellen Sie sich vor, Sie haben diese 2 Arrays ...
und Sie möchten die ersten Werte tauschen:
und Wert:
quelle
Verwendung:
quelle
Array
Prototyps war nicht Teil der Anforderungen - es kann mehr verwirren als nützen.Bei Bedarf nur das erste und das letzte Element austauschen:
quelle
[1, 2, 3] => [3, 1, 2]
anstelle von[1, 2, 3] => [3, 2, 1]
.