Załóżmy, że chciałem funkcji sortowania, która zwraca posortowaną kopię wprowadzonej tablicy. Naiwnie tego próbowałem
function sort(arr) {
return arr.sort();
}
i przetestowałem to z tym, co pokazuje, że moja sort
metoda mutuje tablicę.
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"
Próbowałem również tego podejścia
function sort(arr) {
return Array.prototype.sort(arr);
}
ale to w ogóle nie działa.
Czy istnieje prosty sposób obejścia tego problemu, najlepiej taki, który nie wymaga ręcznego zwijania własnego algorytmu sortowania lub kopiowania każdego elementu tablicy do nowego?
javascript
Peter Olson
źródło
źródło
.sort
wymaga, abythis
wartością była tablica, więc aby ostatni fragment działał, zrobiłbyś to.sort.call(arr)
(choć nie rozwiązuje to problemu).Odpowiedzi:
Po prostu skopiuj tablicę. Można to zrobić na wiele sposobów:
źródło
concat
z powiedzeń,slice(0)
czy są one w zasadzie takie same?Array.prototype.slice.call(arr).sort();
zamiastarr.slice().sort();
?Innym sposobem jest użycie es6 (nie głębokiej kopii):
składnia spreadu jako literał tablicowy (skopiowany z mdn):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
źródło
Spróbuj wykonać następujące czynności
slice(0)
Ekspresji tworzy kopię początkowego tablicy w elemencie 0.źródło
Możesz użyć wycinka bez argumentów, aby skopiować tablicę:
źródło
Możesz także to zrobić
W ten sposób d nie zostanie zmutowany.
źródło
Każdy, kto chce wykonać głęboką kopię (np. Jeśli tablica zawiera obiekty), może użyć:
Następnie możesz sortować
arrCopy
bez zmianarr
.Uwaga: może to być powolne w przypadku bardzo dużych tablic.
źródło
-
zamiast>
w drugim przykładzie.Używam Object.assign () do większości moich kopii:
Jednak po przejrzeniu komentarzy OP, zbadałem trochę głębokiego kopiowania i okazało się, że Object.assign nie tylko wykonuje płytką kopię, ale także wybiera tylko wyliczalne i własne właściwości (zgodnie z odpowiedzią w tym poście ).
źródło