2013-07-01 129 views
1

所以我有散列值的兩個數組:如何基於相同的哈希鍵值合併兩個散列數組?

a = [{"b"=>123,"c"=>456}, {"b"=>456,"c"=>555}] 
b = [{"c"=>456,"d"=>789}, {"b"=>222,"c"=>444}] 

如何將它們連接起來,條件是關鍵c的價值在兩個ab等同?意思是我希望能夠與a['c'] == b['c']

這種狀況並置是我想要得到的結果是:

final_array = [{"b"=>123,"c"=>456,"d"=>789}, {"b"=>456,"c"=>555}, {"b"=>222,"c"=>444}] 
+0

任何一個可以回答這個https://stackoverflow.com/questions/44748498/is-there- any-way-to-check-if-hashes-in-an-an-array-contains-similar-key-value-pairs – Robin

回答

6
a = [{"b"=>123,"c"=>456}, {"b"=>456,"c"=>555}] 
b = [{"c"=>456,"d"=>789}, {"b"=>222,"c"=>444}] 

p a.zip(b).map{|h1,h2| h1["c"] == h2["c"] ? h1.merge(h2) : [h1 ,h2]}.flatten 
# => [{"b"=>123, "c"=>456, "d"=>789}, {"b"=>456, "c"=>555}, {"b"=>222, "c"=>444}] 
0

Enumerable#flat_mapHash#update用於此目的的最佳方法:

a = [{"b"=>123,"c"=>456}, {"b"=>456,"c"=>555}]  
b = [{"c"=>456,"d"=>789}, {"b"=>222,"c"=>444}] 
p a.zip(b).flat_map{|k,v| next k.update(v) if k["c"] == v["c"];[k,v]} 
# >> [{"b"=>123, "c"=>456, "d"=>789}, {"b"=>456, "c"=>555}, {"b"=>222, "c"=>444}] 
+2

k.update做什麼?這是如何特別合併的,只有'c'是相同的,而不是'b'或'd'的? – Edmund

+1

這不會產生像原始海報請求的結果。 – Catnapper

+0

@Edmund由於網絡中斷,我無法編輯這篇文章。現在我完成了。 –

3
a = [{"b"=>123,"c"=>456}, {"b"=>456,"c"=>555}] 
b = [{"c"=>456,"d"=>789}, {"b"=>222,"c"=>444}] 

def merge_hashes_with_equal_values(array_of_hashes, key) 
    array_of_hashes.sort { |a,b| a[key] <=> b[key] }. 
    chunk { |h| h[key] }. 
    each_with_object([]) { |h, result| result << h.last.inject(&:merge) } 
end 

p merge_hashes_with_equal_values(a + b, 'c') 

# => [{"b"=>222, "c"=>444}, {"c"=>456, "d"=>789, "b"=>123}, {"b"=>456, "c"=>555}] 

首先連接數組,然後傳遞它到散列鍵合併的方法。對該數組進行排序,然後將哈希值在另一個數組中相互合併,這使合併更容易編程。在這裏,我選擇了#chunk來處理用相同的鍵合併檢測連續運行的散列,並使用#each_with_object來編譯最終數組。

由於此方法需要一個數組來處理,所以起始數組的長度不需要相等,並且這些數組的排序並不重要。缺點是操作的密鑰必須包含一個可排序的值(例如,不包含nils)。

這裏又是一個解決問題的方法,這其中使用哈希來構建結果:

def merge_hashes_with_equal_values(array_of_hashes, key) 
    result = Hash.new { |h,k| h[k] = {} } 
    remainder = [] 
    array_of_hashes.each_with_object(result) do |h, answer| 
    if h.has_key?(key) 
     answer[h.fetch(key)].merge!(h) 
    else 
     remainder << h 
    end 
    end.values + remainder 
end 
相關問題