J'essaie de comparer deux Ruby Hashes en utilisant le code suivant:
#!/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
La sortie à l'écran est le fichier complet de file2. Je sais pertinemment que les fichiers sont différents, mais le script ne semble pas le saisir.
Réponses:
Vous pouvez comparer les hachages directement pour l'égalité:
Vous pouvez convertir les hachages en tableaux, puis obtenir leur différence:
Simplifier davantage:
Attribuer la différence via une structure ternaire:
Tout faire en une seule opération et supprimer la
difference
variable:la source
hash1.to_a - hash3.to_a
ethash3.to_a - hash1.to_a
peut renvoyer des valeurs non videshash1.size == hash3.size
. La partie après EDIT n'est valide que si les hachages sont de taille différente..to_a
échouera lorsque les hachages égaux ont des clés dans un ordre différent:{a:1, b:2} == {b:2, a:1}
=> true,{a:1, b:2}.to_a == {b:2, a:1}.to_a
=> falseflatten
et*
? Pourquoi pas justeHash[A.to_a - B.to_a]
?Vous pouvez essayer la gemme hashdiff , qui permet une comparaison approfondie des hachages et des tableaux dans le hachage.
Ce qui suit est un exemple:
la source
got_hash.should eql expected_hash
par,HashDiff.diff(got_hash, expected_hash).should eql []
j'obtiens maintenant une sortie qui montre exactement ce dont j'ai besoin. Parfait!use_lcs: false
indicateur peut considérablement accélérer les comparaisons sur les hachages volumineux:Hashdiff.diff(b, a, use_lcs: false)
Si vous souhaitez connaître la différence entre deux hachages, vous pouvez le faire:
la source
Rails désapprouve la
diff
méthode.Pour un one-liner rapide:
la source
to_s
.{a:1, b:2} == {b:2, a:1}
=> true,{a:1, b:2}.to_s == {b:2, a:1}.to_s
=> falseVous pouvez utiliser une simple intersection de tableau, de cette façon, vous pouvez savoir ce qui diffère dans chaque hachage.
la source
J'ai eu le même problème et j'ai envoyé une demande de tirage aux rails
https://github.com/elfassy/rails/commit/5f3410e04fe8c4d4745397db866c9633b80ccec6
la source
Si vous avez besoin d'une différence rapide et sale entre les hachages qui prend correctement en charge nil dans les valeurs, vous pouvez utiliser quelque chose comme
la source
Si vous voulez un diff bien formaté, vous pouvez le faire:
Et dans votre code:
L'idée est d'utiliser une impression impressionnante pour formater et de différencier la sortie. Le diff ne sera pas exact, mais il est utile à des fins de débogage.
la source
... et maintenant sous forme de module à appliquer à une variété de classes de collection (Hash parmi elles). Ce n'est pas une inspection approfondie, mais c'est simple.
la source
J'ai développé ceci pour comparer si deux hachages sont égaux
L'usage:
la source
Cela a été répondu dans " Comparaison des hachages rubis ". Rails ajoute une
diff
méthode aux hachages. Ça marche bien.la source
qu'en est-il de convertir les deux hachage en_json et de les comparer en tant que chaîne? mais en gardant à l'esprit que
la source
Voici un algorithme pour comparer en profondeur deux hachages, qui comparera également des tableaux imbriqués:
La mise en oeuvre:
la source
Que diriez-vous d'une autre approche plus simple:
la source