2013-08-20 24 views
14

Ngay bây giờ, tôi đang sáp nhập hai băm như thế này:Làm cách nào để hợp nhất nhiều băm?

department_hash = self.parse_department html 
super_saver_hash = self.parse_super_saver html 

final_hash = department_hash.merge(super_saver_hash) 

Output:

{: department => { "Đồ Pet" => { "Birds" => 16.281 " Mèo "=> 245512, " Chó "=> 513926," Cá & Vật nuôi thủy sản "=> 46811," Ngựa "=> 14805, " Côn trùng "=> 364," Bò sát & Động vật lưỡng cư "=> 5816," Nhỏ Động vật "=> 19769}},: super_saver => {" Miễn phí Super Saver Giao hàng "=> 126649}}

Nhưng bây giờ tôi muốn hợp nhất nhiều hơn trong tương lai. Ví dụ:

department_hash = self.parse_department html 
super_saver_hash = self.parse_super_saver html 
categories_hash = self.parse_categories html 

Làm cách nào để hợp nhất nhiều băm?

+0

* + 1 * cho câu hỏi tốt .. –

Trả lời

8

Bạn có thể làm dưới đây cách sử dụng Enumerable#inject:

h = {} 
arr = [{:a=>"b"},{"c" => 2},{:a=>4,"c"=>"Hi"}] 
arr.inject(h,:update) 
# => {:a=>4, "c"=>"Hi"} 
arr.inject(:update) 
# => {:a=>4, "c"=>"Hi"} 
23

Làm thế nào về:

[department_hash, super_saver_hash, categories_hash].reduce &:merge 
+0

tại sao ' & '? '[department_hash, super_saver_hash, categories_hash] .reduce (: merge)' là tốt ... –

+0

Đó chỉ là sở thích của tôi. Tôi nghĩ rằng '&' thông báo điều gì đó và đáng giá. – pguardiario

+1

@Babai vì kiểu này phù hợp với ví dụ: 'Enumerable # map' yêu cầu một proc. –

15

Bạn chỉ có thể gọi merge một lần nữa:

h1 = {foo: :bar} 
h2 = {baz: :qux} 
h3 = {quux: :garply} 

h1.merge(h2).merge(h3) 
#=> {:foo=>:bar, :baz=>:qux, :quux=>:garply} 
+1

Tôi nghĩ rằng vấn đề là làm cách nào để thực hiện điều này với một cuộc gọi đơn lẻ. 'h1.merge (h2, h3)' Rõ ràng điều này không thực sự hoạt động, nhưng hành vi đó có thể hữu ích. – bigtunacan

+0

đây là những gì tôi đang tìm kiếm – user1735921

0

Tôi đã mất một thời gian để con số làm thế nào để kết hợp băm đa lồng nhau sau khi đi qua câu hỏi này và câu trả lời của nó. Hóa ra tôi đã lặp lại thông qua các bộ sưu tập của băm không chính xác, gây ra tất cả các loại vấn đề với các giá trị null.

Ứng dụng dòng lệnh sample này cho biết cách hợp nhất nhiều băm với kết hợp storemerge!, tùy thuộc vào việc chúng có phải là khóa băm cấp cao nhất hay không. Nó sử dụng dòng lệnh args với một vài tên khóa được biết cho các mục đích phân loại.

Toàn mã từ URL Gist được cung cấp dưới theo đúng trách nhiệm:

# Ruby - A nested hash example 
# Load each pair of args on the command-line as a key-value pair 
# For example from CMD.exe: 
# call ruby.exe ruby_nested_hash_example.rb Age 30 Name Mary Fav_Hobby Ataraxia Fav_Number 42 
# Output would be: 
    # { 
     # "data_info": { 
     # "types": { 
      # "nums": { 
      # "Age": 30, 
      # "Fav_Number": 42 
      # }, 
      # "strings": { 
      # "Name": "Mary", 
      # "Fav_Hobby": "Ataraxia" 
      # } 
     # }, 
     # "data_id": "13435436457" 
     # } 
    # } 


if (ARGV.count % 2 != 0) || (ARGV.count < 2) 
    STDERR.puts "You must provide an even amount of command-line args to make key-value pairs.\n" 
    abort 
end 
require 'json' 


cmd_hashes = {} 
nums = {} 
strings = {} 
types = {} 
#FYI `tl` == top-level 
all_tl_keys = {} 
data_info = {} 
data_id = {:data_id => "13435436457"} 


_key = "" 
_value = "" 
element = 0 
ARGV.each do |i| 
    if element % 2 == 0 
     _key=i 
    else 
     if (i.to_i!=0) && (i!=0) 
      _value=i.to_i 
     else 
      _value=i 
     end 
    end 
    if (_key != "") && (_value != "") 
     cmd_hashes.store(_key, _value) 
     _key = "" 
     _value = "" 
    end 
    element+=1 
end 


cmd_hashes.each do |key, value| 
    if value.is_a? Numeric 
     nums.store(key, value) 
    else 
     strings.store(key, value) 
    end 
end 


if nums.size  > 0; types.merge!(:nums => nums)     end 
if strings.size  > 0; types.merge!(:strings => strings)   end 
if types.size  > 0; all_tl_keys.merge!(:types => types)   end 
if data_id.size  > 0; all_tl_keys.merge!(data_id)     end 
if all_tl_keys.size > 0; data_info.merge!(:data_info => all_tl_keys) end 


if data_info.size > 0; puts JSON.pretty_generate(data_info)  end 
0

Giả sử bạn đang gặp arr = [{x: 10},{y: 20},{z: 30}] sau đó làm

arr.reduce(:merge) 
Các vấn đề liên quan