Apakah ada cara yang lebih sederhana untuk menukar dua elemen dalam array?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
javascript
arrays
ken
sumber
sumber
a = [b, b = a][0];
seperti yang ditunjukkan oleh @Jan Meskipun saya masih menemukan diri saya menggunakan pendekatan variabel sementara karena itu lintas-bahasa (misalnya C / C ++ ) dan pendekatan pertama yang biasanya muncul di pikiran saya.[ list[y], list[x] ] = [ list[x], list[y] ];
[arr[0], arr[1]] = [arr[1], arr[0]]
hanya menghasilkan[2, 1]
tanpa sisa arrayJika Anda ingin ekspresi tunggal, menggunakan javascript asli, ingat bahwa nilai kembali dari operasi splice berisi elemen yang telah dihapus.
Edit:
The
[0]
diperlukan pada akhir ekspresi sebagaiArray.splice()
hasil array, dan dalam situasi ini kita memerlukan satu elemen dalam array kembali.sumber
Ini sepertinya ok ....
Howerver menggunakan
berarti variabel b akan hadir untuk sisa ruang lingkup. Ini berpotensi menyebabkan kebocoran memori. Tidak mungkin, tetapi masih lebih baik untuk dihindari.
Mungkin ide yang bagus untuk memasukkan ini ke dalam Array.prototype.swap
yang bisa disebut seperti:
Ini adalah pendekatan yang bersih untuk menghindari kebocoran memori dan KERING .
sumber
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; };
Menurut beberapa orang acak di Metafilter , "Versi Javascript terbaru memungkinkan Anda melakukan swap (antara lain) jauh lebih rapi:"
Tes cepat saya menunjukkan bahwa kode Pythonic ini berfungsi dengan baik dalam versi JavaScript yang saat ini digunakan di "Google Apps Script" (".gs"). Sayangnya, tes lebih lanjut menunjukkan kode ini memberikan "Uncaught ReferenceError: sisi kiri tidak valid dalam penugasan." dalam versi apa pun JavaScript (".js") digunakan oleh Google Chrome Versi 24.0.1312.57 m.
sumber
Nah, Anda tidak perlu buffer kedua nilai - hanya satu:
sumber
Anda bisa menukar elemen dalam array dengan cara berikut:
Lihat contoh berikut:
Catatan: ini bekerja dengan cara yang sama untuk variabel biasa
sumber
[list[x], list[y]] = [list[y], list[x]];
.this[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
Dengan nilai numerik Anda dapat menghindari variabel sementara dengan menggunakan bitwise xor
atau jumlah aritmatika (mencatat bahwa ini hanya berfungsi jika x + y kurang dari nilai maksimum untuk tipe data)
sumber
list[y] = list[x] - list[x];
hanya menyamakanlist[y] = 0;
?Ini tidak ada ketika pertanyaan diajukan, tetapi ES2015 memperkenalkan perusakan array, memungkinkan Anda untuk menulisnya sebagai berikut:
sumber
[list[x], list[y]] = [list[y], list[x]];
Untuk menukar dua elemen array berturut-turut
sumber
Intisari dari http://www.greywyvern.com/?post=265
sumber
swap(a, b)
fungsi Anda tidak perlu khawatir tentang keterbacaan.bagaimana dengan Destructure_assignment
yang juga dapat diperpanjang ke
sumber
Pertimbangkan solusi seperti itu tanpa perlu mendefinisikan variabel ketiga:
Catatan: Anda mungkin ingin menambahkan cek tambahan misalnya untuk panjang array. Solusi ini bisa berubah sehingga
swap
fungsi tidak perlu mengembalikan array baru, itu hanya mutasi over array yang dilewatkan.sumber
arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
Anda dapat menukar sejumlah objek atau literal, bahkan dari jenis yang berbeda, menggunakan fungsi identitas sederhana seperti ini:
Untuk masalah Anda:
Ini berfungsi dalam JavaScript karena ia menerima argumen tambahan meskipun tidak dideklarasikan atau digunakan. Penugasan
a=b
dll, terjadi setelaha
diteruskan ke fungsi.sumber
list[y] = (function(x){return x})(list[x],list[x]=list[y]);
. Atau, jika Anda tertarik dengan ES6 (versi JS berikutnya), ini sangat mudah:[list[x], list[y]] = [list[y], list[x]
. Saya sangat senang mereka menambahkan beberapa aspek yang lebih fungsional dan berbasis kelas ke dalam versi JavaScript berikutnya.Untuk dua atau lebih elemen (nomor tetap)
Tidak diperlukan variabel sementara!
Saya sedang berpikir tentang sekadar menelepon
list.reverse()
.Tapi kemudian saya menyadari itu akan berfungsi sebagai swap hanya ketika
list.length = x + y + 1
.Untuk jumlah elemen yang bervariasi
Saya telah melihat berbagai konstruksi Javascript modern untuk efek ini, termasuk Peta dan peta , tetapi sayangnya tidak ada yang menghasilkan kode yang lebih kompak atau lebih cepat daripada konstruksi berbasis loop yang kuno:
sumber
Ada satu cara yang menarik untuk bertukar:
(Cara ES6)
sumber
var a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
sumber
Berikut adalah satu-liner yang tidak bermutasi
list
:let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(Menggunakan fitur bahasa tidak tersedia pada 2009 ketika pertanyaan diposting!)
sumber
Berikut ini adalah nilai swap versi kompak di i1 dengan i2 di arr
sumber
Berikut adalah variasi yang pertama memeriksa apakah indeks ada dalam array:
Saat ini hanya akan kembali
this
jika indeks tidak ada, tetapi Anda dapat dengan mudah mengubah perilaku gagalsumber
Tukar elemen pertama dan terakhir dalam array tanpa metode swap variabel atau ES6 sementara [a, b] = [b, a]
[a.pop(), ...a.slice(1), a.shift()]
sumber
Solusi skrip yang mengkloning larik alih-alih mengubah yang sudah ada
sumber
Hanya untuk bersenang-senang, cara lain tanpa menggunakan variabel tambahan adalah:
sumber
Demi singkatnya, inilah versi one-liner jelek yang hanya sedikit kurang jelek dari semua yang concat dan mengiris di atas. Jawaban yang diterima benar-benar cara untuk pergi dan jauh lebih mudah dibaca.
Diberikan:
jika Anda ingin menukar nilai dua indeks (a dan b); maka ini akan melakukannya:
Misalnya, jika Anda ingin menukar 3 dan 5, Anda bisa melakukannya dengan cara ini:
atau
Keduanya menghasilkan hasil yang sama:
#splicehatersarepunks :)
sumber
Jika Anda tidak ingin menggunakan variabel temp di ES5, ini adalah salah satu cara untuk menukar elemen array.
sumber
a.splice
mengembalikan array dengan elemen yang dihapus. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…coba fungsi ini ...
sumber
sumber
Menggunakan ES6 dimungkinkan untuk melakukannya seperti ini ...
Bayangkan Anda memiliki 2 array ini ...
dan Anda ingin menukar nilai pertama:
dan nilai:
sumber
Pemakaian:
sumber
Array
prototipe bukan bagian dari apa yang diminta - mungkin membingungkan lebih dari itu tidak baik.Jika perlu bertukar elemen pertama dan terakhir saja:
sumber
[1, 2, 3] => [3, 1, 2]
alih-alih[1, 2, 3] => [3, 2, 1]
.