Saya memiliki dua set hasil seperti ini:
// Result 1
[
{ value: "0", display: "Jamsheer" },
{ value: "1", display: "Muhammed" },
{ value: "2", display: "Ravi" },
{ value: "3", display: "Ajmal" },
{ value: "4", display: "Ryan" }
]
// Result 2
[
{ value: "0", display: "Jamsheer" },
{ value: "1", display: "Muhammed" },
{ value: "2", display: "Ravi" },
{ value: "3", display: "Ajmal" },
]
Hasil akhir yang saya butuhkan adalah perbedaan antara array ini - hasil akhirnya harus seperti ini:
[{ value: "4", display: "Ryan" }]
Apakah mungkin melakukan sesuatu seperti ini di JavaScript?
javascript
arrays
object
BKM
sumber
sumber
Jawaban:
Hanya menggunakan JS asli, sesuatu seperti ini akan berfungsi:
sumber
return a.value ===...
jawaban Anda? (Solusi bagus, omong-omong, +1) Selain menggunakanArray.prototype.some()
, saya tidak dapat menemukan cara yang lebih efisien / lebih singkat untuk melakukan ini.true
ataufalse
nilai.) Dalam hal ini, jika kita memisahkan gagasan pengujian persamaan dari kode lainnya dengan meminta pengguna untuk melewati pemeriksaan kesetaraan sebagai fungsi, kita dapat membuat algoritme umum yang langsung.Anda bisa menggunakan
Array.prototype.filter()
kombinasi denganArray.prototype.some()
.Berikut adalah contohnya (dengan asumsi array Anda disimpan dalam variabel
result1
danresult2
):sumber
Bagi mereka yang menyukai solusi satu baris di ES6, seperti ini:
sumber
Saya mengambil pendekatan dengan tujuan yang sedikit lebih umum, meskipun memiliki kesamaan ide dengan pendekatan @Cerbrus dan @Kasper Moerch . Saya membuat fungsi yang menerima predikat untuk menentukan apakah dua objek sama (di sini kita mengabaikan
$$hashKey
properti, tetapi bisa jadi apa saja) dan mengembalikan fungsi yang menghitung perbedaan simetris dari dua daftar berdasarkan predikat itu:Ia memiliki satu keuntungan kecil dibandingkan pendekatan Cerebrus (seperti halnya pendekatan Kasper Moerch) karena ia lolos lebih awal; jika menemukan kecocokan, tidak perlu repot memeriksa daftar lainnya. Jika saya punya
curry
fungsi yang berguna, saya akan melakukan ini sedikit berbeda, tetapi ini berfungsi dengan baik.Penjelasan
Sebuah komentar meminta penjelasan yang lebih detail untuk pemula. Ini usahanya.
Kami meneruskan fungsi berikut ke
makeSymmDiffFunc
:Fungsi ini adalah bagaimana kita memutuskan bahwa dua objek itu sama. Seperti semua fungsi yang mengembalikan
true
ataufalse
, itu bisa disebut "fungsi predikat", tapi itu hanya terminologi. Poin utamanya adalah yangmakeSymmDiffFunc
dikonfigurasi dengan fungsi yang menerima dua objek dan mengembalikantrue
jika kita menganggapnya sama,false
jika tidak.Menggunakan itu,
makeSymmDiffFunc
(baca "membuat perbedaan fungsi simetris") mengembalikan kita fungsi baru:Ini adalah fungsi yang akan kita gunakan. Kami memberikan dua daftar dan menemukan elemen di yang pertama bukan yang kedua, lalu yang kedua bukan yang pertama dan menggabungkan kedua daftar ini.
Namun, memeriksanya lagi, saya pasti bisa mengambil isyarat dari kode Anda dan menyederhanakan fungsi utama sedikit dengan menggunakan
some
:complement
menggunakan predikat dan mengembalikan elemen dari daftar pertamanya, bukan yang kedua. Ini lebih sederhana daripada pass pertama saya dengancontains
fungsi terpisah .Terakhir, fungsi utama dibungkus dalam ekspresi fungsi yang dipanggil segera ( IIFE ) untuk menjaga
complement
fungsi internal tetap berada di luar cakupan global.Perbarui, beberapa tahun kemudian
Sekarang ES2015 telah menjadi cukup baik di mana-mana, saya akan menyarankan teknik yang sama, dengan boilerplate yang jauh lebih sedikit:
sumber
Ini akan mengembalikan perbedaan antara dua array objek, menggunakan kunci
value
untuk membandingkannya. Perhatikan dua hal dengan nilai yang sama tidak akan dikembalikan, karena kunci lainnya diabaikan.Ini adalah bagian dari lodash .
sumber
Anda dapat membuat objek dengan kunci sebagai nilai unik yang sesuai untuk setiap objek dalam array dan kemudian memfilter setiap array berdasarkan keberadaan kunci dalam objek lain. Ini mengurangi kompleksitas operasi.
ES6
ES5
sumber
Saya pikir solusi @Cerbrus sudah tepat. Saya telah menerapkan solusi yang sama tetapi mengekstrak kode berulang ke dalam fungsinya sendiri (KERING).
sumber
Saya menemukan solusi ini menggunakan filter dan beberapa.
sumber
Sebagian besar jawaban di sini agak rumit, tetapi bukankah logika di balik ini cukup sederhana?
Kompleksitas O (n ^ 2).
sumber
Anda dapat melakukan diff a pada b dan diff b pada a, kemudian menggabungkan kedua hasil tersebut
sumber
Saya telah membuat perbedaan umum yang membandingkan 2 objek dalam bentuk apa pun dan dapat menjalankan penangan modifikasi gist.github.com/bortunac "diff.js" sebagai contoh penggunaan:
jadi properti a diubah, b dihapus, c diubah, d ditambahkan
}
sekarang gunakan seperti
konsol akan ditampilkan
sumber
Cara paling umum dan sederhana:
sumber
Saya lebih suka objek peta jika menyangkut array besar.
sumber
JavaScript memiliki Maps, yang menyediakan waktu penyisipan dan pencarian O (1). Oleh karena itu, ini dapat diselesaikan dalam O (n) (dan bukan O (n²) seperti semua jawaban lainnya). Untuk itu, perlu dibuat kunci primitif unik (string / angka) untuk setiap objek. Bisa saja
JSON.stringify
, tetapi itu cukup rawan kesalahan karena urutan elemen dapat memengaruhi kesetaraan:Oleh karena itu, saya akan mengambil pembatas yang tidak muncul di salah satu nilai dan menulis string secara manual:
Kemudian Peta dibuat. Ketika sebuah elemen sudah ada di Peta, itu akan dihapus, jika tidak maka akan ditambahkan. Oleh karena itu hanya elemen yang termasuk waktu ganjil (artinya hanya sekali) yang tersisa. Ini hanya akan berfungsi jika elemennya unik di setiap larik:
Tampilkan cuplikan kode
sumber
Saya menemukan pertanyaan ini saat mencari cara untuk memilih item pertama dalam satu array yang tidak cocok dengan salah satu nilai dalam array lain dan berhasil menyelesaikannya pada akhirnya dengan array.find () dan array.filter () like ini
jika Anda perlu terus mengambil daftar yang diperbarui sebelum memeriksa ulang untuk opsi terbaik berikutnya, ini akan bekerja dengan cukup baik :)
sumber
Jika Anda ingin menggunakan pustaka eksternal, Anda dapat menggunakan _.difference di underscore.js untuk melakukannya. _.difference mengembalikan nilai dari array yang tidak ada di array lain.
sumber