Anggap saja saya menginginkan fungsi sortir yang mengembalikan salinan array input yang diurutkan. Dengan naif saya mencoba ini
function sort(arr) {
return arr.sort();
}
dan saya mengujinya dengan ini, yang menunjukkan bahwa sort
metode saya memutasikan array.
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"
Saya juga mencoba pendekatan ini
function sort(arr) {
return Array.prototype.sort(arr);
}
tetapi tidak berhasil sama sekali.
Apakah ada cara langsung di sekitar ini, lebih baik cara yang tidak memerlukan pengguliran tangan algoritma pengurutan saya sendiri atau menyalin setiap elemen dari array ke yang baru?
javascript
Peter Olson
sumber
sumber
.sort
membutuhkanthis
nilai untuk menjadi array, jadi agar potongan terakhir berfungsi, Anda akan melakukannya.sort.call(arr)
(meskipun itu tidak menyelesaikan masalah Anda).Jawaban:
Cukup salin array. Ada banyak cara untuk melakukan itu:
sumber
concat
lebih dari mengatakanslice(0)
atau mereka semua hampir sama saja?Array.prototype.slice.call(arr).sort();
bukannyaarr.slice().sort();
?Cara lain dengan es6 (salinan tidak dalam):
sintaks spread sebagai literal array (disalin dari mdn):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
sumber
Coba yang berikut ini
The
slice(0)
ekspresi membuat salinan dari array mulai pukul elemen 0.sumber
Anda bisa menggunakan slice tanpa argumen untuk menyalin array:
sumber
Anda juga bisa melakukan ini
Dengan cara ini d tidak akan termutasi.
sumber
Siapa pun yang ingin melakukan salinan dalam (mis. Jika array Anda berisi objek) dapat menggunakan:
Maka Anda dapat mengurutkan
arrCopy
tanpa mengubaharr
.Harap dicatat: ini bisa lambat untuk array yang sangat besar.
sumber
-
sebagai gantinya>
dalam contoh kedua Anda.Saya menggunakan Object.assign () untuk sebagian besar salinan saya:
Namun, setelah melihat melalui komentar OP, saya meneliti sedikit penyalinan dalam dan ternyata Object.assign tidak hanya melakukan salinan dangkal, tetapi juga hanya memilih enumerable dan memiliki properti (seperti dijawab dalam posting ini ).
sumber