Jeśli używasz aktu ivesupport (część szyn), można skorzystać z 2 dodatkowymi metodami na Hash
:
Hash#slice
wykonuje żądane klawisze odsunięte (nie tablicę kluczy) i zwraca nowy hash z zaledwie klawiszy Pytałeś dla.
Hash#except
przyjmuje te same argumenty co slice
, ale zwraca nowy skrót z kluczami, których nie ma w argumentach.
pierwsze ActiveSupport obciążenie:
require 'active_support/core_ext'
Scal wpisy tylko z j
których klucze są już h
(tjmodyfikować, ale nie dodawać dowolne lub usunąć wpisy w h
):
h.merge(j.slice(*h.keys))
Przykład:
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}
Get resztki z j
, które nie były w h
:
j.except(*h.keys)
Bonus:
Jeśli chcesz prawdziwe skrzyżowanie, czyli chcesz rezultatu, który ma tylko klucze, które są wspólne między 2 mieszań, to zrobić:
h.merge(j).slice(* (h.keys & j.keys))
Przykład:
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}
i resztki z h
że byłeś „tw j
:
h.except(*j.keys)
można również użyć ActiveSupport na HashWithIndifferentAccess
jeśli chcesz ciąg & symbol klucza dostępu, aby można go było uznać za równoważny.
Należy zauważyć, że żaden z powyższych przykładów nie zmienia oryginalnych skrótów; zamiast tego zwracane są nowe skróty.
To jest jak skrzyżowanie hash. Co chcesz zrobić z parami klucz/wartość o różnych wartościach? Na przykład: h = {: foo => "value1"}; j = {: foo => "value2",: extra => "value"} –
@Ron Gejman - Po prostu chcę je wyrzucić. Ale wzbudziłeś moje zainteresowanie. Czy istnieje metoda hash/przeliczalna, która zwróci dwa hashe (jeden z duplikatami i drugi z resztkami)? – elmt
Nie, ale łatwo można użyć czegoś podobnego do odpowiedzi DigitalRoss. Po prostu zapisz dwa różne skróty - jeden na mecze i jeden na nie. –