Ich versuche zwei Ruby Hashes mit dem folgenden Code zu vergleichen:
#!/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
Die Ausgabe auf dem Bildschirm ist die vollständige Datei aus Datei2. Ich weiß sicher, dass die Dateien unterschiedlich sind, aber das Skript scheint es nicht aufzunehmen.
Antworten:
Sie können Hashes direkt auf Gleichheit vergleichen:
Sie können die Hashes in Arrays konvertieren und dann ihren Unterschied ermitteln:
Weiter vereinfachen:
Differenz über eine ternäre Struktur zuweisen:
Alles in einer Operation erledigen und die
difference
Variable loswerden :quelle
hash1.to_a - hash3.to_a
undhash3.to_a - hash1.to_a
möglicherweise nicht leere Werte zurückhash1.size == hash3.size
. Der Teil nach EDIT ist nur gültig, wenn Hashes unterschiedlicher Größe sind..to_a
wird fehlschlagen, wenn gleiche Hashes Schlüssel in einer anderen Reihenfolge haben:{a:1, b:2} == {b:2, a:1}
=> wahr,{a:1, b:2}.to_a == {b:2, a:1}.to_a
=> falschflatten
und*
? Warum nicht einfachHash[A.to_a - B.to_a]
?Sie können den Hashdiff- Edelstein ausprobieren , der einen umfassenden Vergleich von Hashes und Arrays im Hash ermöglicht.
Das Folgende ist ein Beispiel:
quelle
got_hash.should eql expected_hash
mitHashDiff.diff(got_hash, expected_hash).should eql []
mir jetzt Ausgang, zeigt genau das, was ich brauche. Perfekt!use_lcs: false
Flagge kann Vergleiche mit großen Hashes erheblich beschleunigen:Hashdiff.diff(b, a, use_lcs: false)
Wenn Sie den Unterschied zwischen zwei Hashes ermitteln möchten, können Sie Folgendes tun:
quelle
Schienen deprecating das
diff
Verfahren.Für einen schnellen Einzeiler:
quelle
to_s
.{a:1, b:2} == {b:2, a:1}
=> wahr,{a:1, b:2}.to_s == {b:2, a:1}.to_s
=> falschSie können einen einfachen Array-Schnittpunkt verwenden, um zu erkennen, was sich in den einzelnen Hashs unterscheidet.
quelle
Ich hatte das gleiche Problem und schickte eine Pull-Anfrage an Rails
https://github.com/elfassy/rails/commit/5f3410e04fe8c4d4745397db866c9633b80ccec6
quelle
Wenn Sie einen schnellen und schmutzigen Unterschied zwischen Hashes benötigen, der Nullwerte korrekt unterstützt, können Sie so etwas wie verwenden
quelle
Wenn Sie ein schön formatiertes Diff wünschen, können Sie dies tun:
Und in Ihrem Code:
Die Idee ist, großartigen Druck zu verwenden, um die Ausgabe zu formatieren und zu differenzieren. Der Unterschied ist nicht genau, aber für Debugging-Zwecke nützlich.
quelle
... und jetzt in Modulform für eine Vielzahl von Sammlungsklassen (darunter auch Hash). Es ist keine gründliche Inspektion, aber es ist einfach.
quelle
Ich habe dies entwickelt, um zu vergleichen, ob zwei Hashes gleich sind
Die Verwendung:
quelle
Dies wurde unter " Vergleichen von Rubin-Hashes " beantwortet . Rails fügt Hashes eine
diff
Methode hinzu . Es funktioniert gut.quelle
Was ist mit dem Konvertieren von Hash in_json und dem Vergleichen als Zeichenfolge? aber denken Sie daran
quelle
Hier ist ein Algorithmus zum gründlichen Vergleichen von zwei Hashes, mit dem auch verschachtelte Arrays verglichen werden:
Implementierung:
quelle
Wie wäre es mit einem anderen, einfacheren Ansatz:
quelle