Si está usando el acto ivesupport (parte de rieles), se puede tomar ventaja de 2 métodos adicionales en Hash
:
Hash#slice
toma las teclas deseadas como argumentos separados (no una matriz de claves) y devuelve un nuevo hash con sólo las teclas que solicitó para.
Hash#except
toma los mismos argumentos que slice
, pero devuelve un nuevo hash con claves que no estaban en los argumentos.
Primera ActiveSupport carga:
require 'active_support/core_ext'
Combinar sólo las entradas de j
cuyas claves ya están en h
(es decir,modificar, pero no agregue cualquiera o eliminar entradas en h
):
h.merge(j.slice(*h.keys))
Ejemplo:
ignore_new = ->(h, j) { h.merge(j.slice(* h.keys)) }
ignore_new.({a: 1, b: 2, c: 3}, {b: 10, c: 11, d: 12})
# => {:a=>1, :b=>10, :c=>11}
Obtener las sobras de j
que no estaban en h
:
j.except(*h.keys)
Bonificación:
Si quieres verdadera intersección, lo que significa que quiere un resultado que sólo se dispone de teclas que se encuentran en común entre los 2 valores hash, hacer esto:
h.merge(j).slice(* (h.keys & j.keys))
Ejemplo:
intersect = ->(h, j) { h.merge(j).slice(* (h.keys & j.keys)) }
intersect.({a: 1, b: 2, c: 3}, {b: 10, c: 11, d: 12})
# => {:b=>10, :c=>11}
y sobras de h
que weren 't en j
:
h.except(*j.keys)
también puede que quiera usar ActiveSupport de HashWithIndifferentAccess
si quieres cadena & símbolo de acceso a clave para ser considerado equivalente.
Tenga en cuenta que ninguno de los ejemplos anteriores cambian los valores hash originales; nuevos hashes son devueltos en su lugar.
Esto es como una intersección hash. ¿Qué quiere que suceda con los pares clave/valor con diferentes valores? Por ejemplo: h = {: foo => "value1"}; j = {: foo => "value2",: extra => "value"} –
@Ron Gejman - Solo quiero echarlos. Pero has despertado mi interés. ¿Hay algún método hash/enumerable que devuelva dos hashes (uno con las claves duplicadas y otro con las sobras)? – elmt
No, pero es fácil usar algo similar a la respuesta de DigitalRoss. Solo guárdelo en dos hashes diferentes: uno para los partidos y otro para los que no coinciden. –