Nếu bạn đang sử dụng hành động ivesupport (một phần của đường ray), bạn có thể tận dụng 2 phương thức bổ sung vào Hash
:
Hash#slice
mất các phím mong muốn như các đối số riêng biệt (không phải là một mảng của các phím) và trả về một băm mới chỉ với các phím bạn hỏi cho.
Hash#except
có các đối số giống như slice
, nhưng trả về một băm mới bằng các khóa không có trong đối số.
tải đầu tiên activesupport:
require 'active_support/core_ext'
Merge chỉ mục từ j
có phím đã có trong h
(ví dụ:sửa đổi, nhưng không thêm bất kỳ hoặc loại bỏ các mục trong h
):
h.merge(j.slice(*h.keys))
Ví dụ:
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}
Lấy thức ăn thừa từ j
mà không được ở h
:
j.except(*h.keys)
Phần thưởng:
Nếu bạn muốn ngã tư đúng, có nghĩa là bạn muốn có một kết quả mà chỉ có các phím được điểm chung giữa 2 băm, làm điều này:
h.merge(j).slice(* (h.keys & j.keys))
Ví dụ:
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}
và thức ăn thừa từ h
rằng weren 't trong j
:
h.except(*j.keys)
bạn cũng có thể muốn sử dụng activesupport của HashWithIndifferentAccess
nếu bạn muốn chuỗi & phím biểu tượng truy cập được coi là tương đương.
Lưu ý rằng không có ví dụ nào trên đây thay đổi băm ban đầu; băm mới được trả lại để thay thế.
Điều này giống như giao điểm băm. Bạn muốn điều gì xảy ra với cặp khóa/giá trị với các giá trị khác nhau? Ví dụ: h = {: foo => "value1"}; j = {: foo => "value2",: extra => "value"} –
@Ron Gejman - Tôi chỉ muốn loại bỏ chúng. Nhưng bạn đã làm tôi ngạc nhiên. Có một số phương pháp băm/enumerable mà sẽ trả lại hai băm (một với các phím trùng lặp và một với các thức ăn thừa)? – elmt
Không, nhưng thật dễ dàng để sử dụng một thứ gì đó dọc theo dòng câu trả lời của DigitalRoss. Chỉ cần lưu vào hai băm khác nhau — một cho các kết quả phù hợp và một cho các kết quả không phù hợp. –