Saya mencoba membandingkan dua Ruby Hashes menggunakan kode berikut:
#!/usr/bin/env ruby
require "yaml"
require "active_support"
file1 = YAML::load(File.open('./en_20110207.yml'))
file2 = YAML::load(File.open('./locales/en.yml'))
arr = []
file1.select { |k,v|
file2.select { |k2, v2|
arr << "#{v2}" if "#{v}" != "#{v2}"
}
}
puts arr
Output ke layar adalah file lengkap dari file2. Saya tahu pasti bahwa file-file itu berbeda, tetapi skrip sepertinya tidak mengambilnya.
Jawaban:
Anda dapat membandingkan hash secara langsung untuk persamaan:
Anda dapat mengonversi hash menjadi array, lalu dapatkan perbedaannya:
Menyederhanakan lebih lanjut:
Menetapkan perbedaan melalui struktur terner:
Melakukan semuanya dalam satu operasi dan menyingkirkan
difference
variabel:sumber
hash1.to_a - hash3.to_a
danhash3.to_a - hash1.to_a
dapat mengembalikan nilai tidak kosonghash1.size == hash3.size
. Bagian setelah EDIT hanya valid jika hash memiliki ukuran yang berbeda..to_a
akan gagal ketika hash yang sama memiliki kunci dalam urutan yang berbeda:{a:1, b:2} == {b:2, a:1}
=> true,{a:1, b:2}.to_a == {b:2, a:1}.to_a
=> falseflatten
dan*
? Kenapa tidakHash[A.to_a - B.to_a]
?Anda dapat mencoba permata hashdiff , yang memungkinkan perbandingan mendalam antara hash dan array dalam hash.
Berikut ini adalah contohnya:
sumber
got_hash.should eql expected_hash
denganHashDiff.diff(got_hash, expected_hash).should eql []
saya sekarang mendapatkan keluaran yang menunjukkan dengan tepat apa yang saya butuhkan. Sempurna!use_lcs: false
bendera secara signifikan dapat mempercepat perbandingan pada hash besar:Hashdiff.diff(b, a, use_lcs: false)
Jika Anda ingin mendapatkan perbedaan antara dua hash, Anda dapat melakukan ini:
sumber
Rel yang mencela para
diff
metode.Untuk satu baris cepat:
sumber
to_s
.{a:1, b:2} == {b:2, a:1}
=> true,{a:1, b:2}.to_s == {b:2, a:1}.to_s
=> falseAnda bisa menggunakan perpotongan array sederhana, dengan cara ini Anda bisa mengetahui apa yang berbeda di setiap hash.
sumber
Saya memiliki masalah yang sama dan mengirim permintaan tarik ke rel
https://github.com/elfassy/rails/commit/5f3410e04fe8c4d4745397db866c9633b80ccec6
sumber
Jika Anda membutuhkan perbedaan cepat dan kotor antara hash yang dengan benar mendukung nil dalam nilai, Anda dapat menggunakan sesuatu seperti
sumber
Jika Anda menginginkan diff berformat bagus, Anda dapat melakukan ini:
Dan di kode Anda:
Idenya adalah menggunakan cetakan yang luar biasa untuk memformat, dan membedakan hasilnya. Perbedaannya tidak persis sama, tetapi berguna untuk tujuan debugging.
sumber
... dan sekarang dalam bentuk modul untuk diterapkan ke berbagai kelas koleksi (ada hash di antara mereka). Ini bukan pemeriksaan yang mendalam, tapi sederhana.
sumber
Saya mengembangkan ini untuk membandingkan jika dua hash sama
Penggunaan:
sumber
Ini dijawab dalam " Membandingkan hash ruby ". Rails menambahkan
diff
metode pada hash. Ini bekerja dengan baik.sumber
bagaimana dengan mengonversi hash to_json dan membandingkannya sebagai string? tapi ingatlah itu
sumber
Berikut adalah algoritma untuk membandingkan dua Hash secara mendalam, yang juga akan membandingkan Array bersarang:
Penerapan:
sumber
Bagaimana dengan pendekatan lain yang lebih sederhana:
sumber