Estoy tratando de comparar dos Ruby Hashes usando el siguiente código:
#!/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 salida a la pantalla es el archivo completo de file2. Sé a ciencia cierta que los archivos son diferentes, pero el script no parece captarlo.
Respuestas:
Puede comparar hashes directamente para la igualdad:
Puede convertir los hash en matrices y luego obtener su diferencia:
Simplificando aún más:
Asignar diferencia a través de una estructura ternaria:
Haciéndolo todo en una sola operación y deshaciéndose de la
difference
variable:fuente
hash1.to_a - hash3.to_a
yhash3.to_a - hash1.to_a
pueden devolver valores no vacíoshash1.size == hash3.size
. La parte posterior a EDIT solo es válida si los hashes son de diferente tamaño..to_a
fallará cuando los hash iguales tengan claves en un orden diferente:{a:1, b:2} == {b:2, a:1}
=> verdadero,{a:1, b:2}.to_a == {b:2, a:1}.to_a
=> falsoflatten
y*
? ¿Por qué no simplementeHash[A.to_a - B.to_a]
?Puede probar la gema hashdiff , que permite una comparación profunda de hashes y matrices en el hash.
Lo siguiente es un ejemplo:
fuente
got_hash.should eql expected_hash
conHashDiff.diff(got_hash, expected_hash).should eql []
, ahora obtengo un resultado que muestra exactamente lo que necesito. ¡Perfecto!use_lcs: false
bandera puede acelerar significativamente las comparaciones en hash grandes:Hashdiff.diff(b, a, use_lcs: false)
Si desea obtener cuál es la diferencia entre dos hashes, puede hacer esto:
fuente
Rails está desaprobando el
diff
método.Para una línea rápida:
fuente
to_s
.{a:1, b:2} == {b:2, a:1}
=> verdadero,{a:1, b:2}.to_s == {b:2, a:1}.to_s
=> falsoPuede usar una intersección de matriz simple, de esta manera puede saber qué difiere en cada hash.
fuente
Tuve el mismo problema y envié una solicitud de extracción a rieles
https://github.com/elfassy/rails/commit/5f3410e04fe8c4d4745397db866c9633b80ccec6
fuente
Si necesita una diferencia rápida y sucia entre hashes que admita correctamente valores nulos, puede usar algo como
fuente
Si desea una diferencia con un formato agradable, puede hacer esto:
Y en tu código:
La idea es utilizar una impresión impresionante para formatear y diferenciar la salida. La diferencia no será exacta, pero es útil para depurar.
fuente
... y ahora en forma de módulo para ser aplicado a una variedad de clases de colección (Hash entre ellas). No es una inspección profunda, pero es simple.
fuente
Desarrollé esto para comparar si dos hashes son iguales
El uso:
fuente
Esto se respondió en " Comparación de hashes ruby ". Rails agrega un
diff
método a los hash. Funciona bien.fuente
¿qué hay de convertir hash to_json y comparar como cadena? pero teniendo en cuenta que
fuente
Aquí hay un algoritmo para comparar en profundidad dos Hashes, que también compararán matrices anidadas:
Implementación:
fuente
¿Qué tal otro enfoque más simple?
fuente