Angenommen, ich wollte eine Sortierfunktion, die eine sortierte Kopie des eingegebenen Arrays zurückgibt. Ich habe das naiv versucht
function sort(arr) {
return arr.sort();
}
und ich habe es damit getestet, was zeigt, dass meine sort
Methode das Array mutiert.
var a = [2,3,7,5,3,7,1,3,4];
sort(a);
alert(a); //alerts "1,2,3,3,3,4,5,7,7"
Ich habe diesen Ansatz auch ausprobiert
function sort(arr) {
return Array.prototype.sort(arr);
}
aber es funktioniert überhaupt nicht.
Gibt es einen einfachen Weg, um dies zu umgehen, vorzugsweise einen Weg, bei dem nicht mein eigener Sortieralgorithmus von Hand gerollt oder jedes Element des Arrays in ein neues kopiert werden muss?
javascript
Peter Olson
quelle
quelle
.sort
erfordert, dass derthis
Wert das Array ist, damit das letzte Snippet funktioniert.sort.call(arr)
(obwohl es Ihr Problem nicht löst).Antworten:
Kopieren Sie einfach das Array. Dafür gibt es viele Möglichkeiten:
quelle
concat
over sayslice(0)
oder sind sie alle ziemlich gleich?Array.prototype.slice.call(arr).sort();
stattarr.slice().sort();
?Ein anderer Weg mit es6 (nicht tiefe Kopie):
die Spread-Syntax als Array-Literal (kopiert von mdn):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
quelle
Versuche Folgendes
Der
slice(0)
Ausdruck erstellt eine Kopie des Arrays ab Element 0.quelle
Sie können Slice ohne Argumente verwenden, um ein Array zu kopieren:
quelle
Sie können dies auch tun
Auf diese Weise wird d nicht mutiert.
quelle
Jeder, der eine tiefe Kopie erstellen möchte (z. B. wenn Ihr Array Objekte enthält), kann Folgendes verwenden:
Dann können Sie sortieren,
arrCopy
ohne zu ändernarr
.Bitte beachten Sie: Dies kann bei sehr großen Arrays langsam sein.
quelle
-
statt>
in Ihrem zweiten Beispiel.Ich verwende Object.assign () für die meisten meiner Kopien:
Nachdem ich die OP-Kommentare durchgesehen hatte, recherchierte ich ein bisschen tiefgreifendes Kopieren und stellte fest, dass Object.assign nicht nur eine flache Kopie ausführt, sondern auch nur aufzählbare und eigene Eigenschaften auswählt (wie in diesem Beitrag beantwortet ).
quelle