Saya memiliki dua array ini: satu diisi dengan informasi dari permintaan ajax dan yang lainnya menyimpan tombol yang diklik pengguna. Saya menggunakan kode ini (saya isi dengan nomor sampel):
var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
doSomething();
}else{
doAnotherThing();
}
Tapi itu selalu memberi false
, meski dua larik itu sama, tapi dengan nama berbeda. (Saya memeriksa ini di Konsol JS Chrome). Jadi, adakah cara saya bisa mengetahui jika kedua array ini berisi sama? Mengapa memberi false
? Bagaimana saya bisa tahu nilai mana di larik pertama yang tidak ada di larik kedua?
javascript
arrays
compare
Carlos Precioso
sumber
sumber
Jawaban:
Perhatikan bahwa ini tidak mengubah larik asli tidak seperti jawaban sebelumnya.
sumber
Jika item array Anda bukan objek- jika berupa angka atau string, misalnya, Anda dapat membandingkan string yang digabungkan untuk melihat apakah mereka memiliki anggota yang sama dalam urutan apa pun-
sumber
['a', 'b']
dan['a,b']
. Saya hanya akan merekomendasikan teknik ini untuk skrip kecil sekali pakai.Jika Anda ingin memeriksa hanya jika dua larik memiliki nilai yang sama (terlepas dari jumlah kemunculan dan urutan setiap nilai), Anda dapat melakukan ini dengan menggunakan lodash :
Pendek, sederhana dan cantik!
sumber
xor
di dokumen garis bawah? Apakah Anda memikirkan IODash?Mungkin?
sumber
Mengapa kode Anda tidak berfungsi
JavaScript memiliki tipe data primitif dan tipe data non-primitif.
Untuk tipe data primitif,
==
dan===
periksa apakah hal-hal di kedua sisi bilah memiliki nilai yang sama. Itulah mengapa1 === 1
benar.Untuk tipe data non-primitif seperti array,
==
dan===
periksa persamaan referensi. Artinya, mereka memeriksa apakaharr1
danarr2
merupakan objek yang sama. Dalam contoh Anda, dua larik memiliki objek yang sama dalam urutan yang sama, tetapi tidak ekuivalen.Solusi
Dua larik,
arr1
danarr2
, memiliki anggota yang sama jika dan hanya jika:arr2
dalamarr1
DAN
arr1
dalamarr2
Jadi ini akan melakukan triknya (ES2016):
Solusi kedua ini menggunakan Underscore lebih dekat dengan apa yang Anda coba lakukan:
Ini berfungsi karena
isEqual
memeriksa "kesetaraan mendalam", yang berarti ia melihat lebih dari sekadar persamaan referensi dan membandingkan nilai.Solusi untuk pertanyaan ketiga Anda
Anda juga bertanya bagaimana cara mengetahui hal-hal mana
arr1
yang tidak terkandung di dalamnyaarr2
.Ini akan melakukannya (ES2015):
Anda juga bisa menggunakan
difference
metode Underscore's :MEMPERBARUI
Lihat komentar @ Redu — solusi saya adalah untuk
sameMembers
, tetapi yang ada dalam pikiran Anda mungkinsameMembersInOrder
juga dikenal sebagaideepEquals
.UPDATE 2
Jika Anda tidak peduli tentang urutan anggota array, ES2015 +
Set
mungkin merupakan struktur data yang lebih baik daripadaArray
. Lihat catatan MDN tentang cara menerapkanisSuperset
dandifference
menggunakan penambalan monyet yang berbahaya.sumber
sameMembers([1,1,2],[2,1,2]);
harus mengembalikan false.sameMembers([1,1,2],[2,1,2])
harus kembalitrue
, menurut saya.sameMembersInOrder([1,1,2],[2,1,2])
AKAdeepEquals([1,1,2],[2,1,2])
harus kembalifalse
.arr1.filter...
hanya akan bekerja untuk memeriksa apakah arr2 memiliki semua elemen arr1 atau tidak tetapi tidak sebaliknya yang juga diperlukan.Pemeriksaan kesetaraan objek:
JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())
Tes di atas juga bekerja dengan array objek yang menggunakan fungsi sortir seperti yang didokumentasikan di http://www.w3schools.com/jsref/jsref_sort.asp
Mungkin cukup untuk array kecil dengan skema JSON datar.
sumber
Tujuan kami pada dasarnya adalah untuk memeriksa apakah 2 array adalah set yang sama. set adalah didefinisikan secara matematis set . Penyortiran tercepat secara asimtotik membutuhkan waktu O (nlog (n)) . Jadi jika Anda mengurutkan sebuah array, itu akan memakan waktu setidaknya O (nlog (n)) . Tetapi Anda dapat melakukan tugas ini lebih cepat , yang secara asimtotik memerlukan waktu O (n) (kasus rata-rata bukan kasus terburuk) dengan struktur data kamus. Di JS, kamus hanyalah sebuah objek dengan kunci dan nilai.
Perhatikan bahwa fungsi ini bekerja dengan array dari tipe dan asumsi primitif
a1
dana2
merupakan array.sumber
Bagaimana dengan ini? ES 2017 saya kira:
Kondisi pertama memeriksa apakah kedua larik memiliki panjang yang sama dan kondisi kedua memeriksa apakah larik pertama adalah subset dari larik ke-2. Menggabungkan 2 kondisi ini kemudian harus menghasilkan perbandingan semua item dari 2 larik terlepas dari urutan elemennya.
Kode di atas hanya akan berfungsi jika kedua larik memiliki item non-duplikat.
sumber
Saat Anda membandingkan kedua larik tersebut, Anda membandingkan objek yang mewakili larik, bukan isinya.
Anda harus menggunakan fungsi untuk membandingkan keduanya. Anda dapat menulis sendiri yang hanya mengulang satu dan membandingkannya dengan yang lain setelah Anda memeriksa bahwa panjangnya sama.
sumber
Solusi sederhana untuk kesetaraan dangkal menggunakan ES6:
Membuat salinan dangkal dari setiap larik dan mengurutkannya. Kemudian gunakan
some()
untuk mengulang melaluiarr1test
nilai, memeriksa setiap nilai terhadap nilaiarr2test
dengan indeks yang sama. Jika semua nilai sama,some()
mengembalikanfalse
, dan pada gilirannyaequal
mengevaluasi ketrue
.Bisa juga digunakan
every()
, tetapi harus menggilir setiap elemen dalam larik untuk memenuhitrue
hasil, sedangkansome()
akan menebus segera setelah menemukan nilai yang tidak sama:sumber
Saya memiliki nilai integer sederhana dalam proyek Game
Memiliki jumlah nilai yang lebih sedikit di setiap array, juga, membutuhkan array asli itu tidak tersentuh
Jadi, saya melakukan yang di bawah ini, itu berfungsi dengan baik. (Kode diedit untuk ditempel di sini)
Semoga membantu.
sumber
Menggunakan ES6
Kita akan menggunakan
equals
fungsi Ramda , tetapi kita bisa menggunakan fungsi Lodash atau UnderscoreisEqual
:Dengan menggunakan opporator penyebaran, kami menghindari mutasi array asli, dan kami menjaga fungsi kami tetap murni.
sumber
Anda dapat menggunakan
reduce
alih-alih loop agar terlihat pintar, tetapi dengan risiko rekan pengembang menganggap Anda sebagai orang yang cerdas.sumber
Jika item dalam array bersifat primitif (angka atau karakter tunggal), Anda dapat menggunakan kombinasi perbandingan panjang, dan menggunakan set.
sumber
Ini sudah tahun 2020 tetapi saya perhatikan bahwa sebagian besar solusi lain menggunakan sort, O (n * log n), menggunakan perpustakaan atau memiliki kompleksitas O (n ^ 2).
Berikut adalah solusi Javascript murni dengan kompleksitas linier, O (n):
Tes:
sumber
Jika Anda menggunakan Prototype Framework, Anda dapat menggunakan metode intersect dari sebuah array untuk mengetahui bahwa keduanya sama (terlepas dari urutannya):
sumber
[1,2].intersect([1,2,3]).length === [1,2].length
mengembalikan true. Anda juga harus membandingkan panjang array asli, saya telah mengedit postingan untuk didemonstrasikan.array1 = [1,1,2]; array2 = [1,1,2];
... jawaban asli tidak gagal untuk input itu._.difference(array1, array2).length;
mohon periksa jawaban ini
sumber
return
kemauan tidak berpengaruh. Kedua, Anda harus memeriksa array yang diurutkan, karena[1,2]
dan[2,1]
akan dideteksi sebagai tidak sama. Ketiga dan yang paling penting, ini sebenarnya hanya akan memeriksa apakah beberapa elemen sama. Kondisionalnya harusif (array1!==array2) {return false;}
. Mungkin ini bisa membantu Anda di masa depan!array1
danarray2
bisa diganti namanyaelem1
danelem2
. Kedua tips ini akan menghemat banyak sakit kepala di masa mendatang!Menjawab setelah waktu yang lama tetapi berharap ini akan membantu seseorang yang mencari solusi sederhana dan pemula yang modern.
Sekarang kita dapat mencapai ini menggunakan banyak pustaka seperti
lodash
,,underscore
dll. (Ini menjadi bagian dari proyek saat ini karena kesederhanaan, banyak fitur dan penggunaan yang tinggi)Anda dapat menggunakan persimpangan dari perpustakaan lodash.
Ini akan bekerja untuk semua tipe data ..
sumber
Jika Anda ingin membandingkan dua larik dan memeriksa apakah ada objek yang sama di kedua larik itu akan berhasil. Contoh:
Larik1 = [a, b, c, d]
Larik2 = [d, e, f, g]
Di sini, 'd' umum di kedua larik sehingga fungsi ini akan mengembalikan nilai sebenarnya.
sumber
Coba ini
sumber
Saya memiliki cara lain berdasarkan jawaban yang diterima.
sumber
Fungsi untuk membandingkan dua Array, untuk memeriksa apakah keduanya memiliki elemen yang sama. Bahkan jika mereka rusak ...
Ini bagus untuk array sederhana. [String, Number, Boolean, null, NaN].
Saya tidak menggunakan .sort (), itu memodifikasi array asli. Ada yang bilang itu buruk ...
Peringatan. Fungsi ini terbatas sehingga tidak dapat membandingkan Objek "[], {}" atau fungsi di dalam Array ini, array itu sendiri adalah Objek.
sumber
Solusi Sederhana untuk membandingkan dua larik:
sumber