Tôi có một Hash mà có dạng {:a => {"aa" => 11,"ab" => 12}, :b => {"ba" => 21,"bb" => 22}}
Chuyển đổi của Ruby băm cho các mảng
Làm thế nào để tôi chuyển nó sang dạng {:a => [["aa",11],["ab",12]],:b=>[["ba",21],["bb",22]]}
Tôi có một Hash mà có dạng {:a => {"aa" => 11,"ab" => 12}, :b => {"ba" => 21,"bb" => 22}}
Chuyển đổi của Ruby băm cho các mảng
Làm thế nào để tôi chuyển nó sang dạng {:a => [["aa",11],["ab",12]],:b=>[["ba",21],["bb",22]]}
Nếu bạn muốn thay đổi băm ban đầu bạn có thể làm:
hash.each_pair { |key, value| hash[key] = value.to_a }
Từ tài liệu cho Hash#to_a
Chuyển đổi hsh thành mảng lồng nhau của mảng [ khóa, giá trị].
h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
h.to_a #=> [["c", 300], ["a", 100], ["d", 400]]
Cảm ơn bạn @mikej. Làm việc như một say mê, mặc dù tôi muốn biết sự khác biệt giữa hash.each và hash.each_pair là gì? –
Nếu bạn không muốn sửa đổi băm gốc, bạn có thể sử dụng hàm này: 'new_hash = hash.inject ({}) {| h, (khóa, giá trị) | h [key] = value.to_a; h} ' –
@Aditya: Nếu bạn muốn khối của mình lấy hai tham số, hãy sử dụng' each_pair'. Nếu chỉ cho dễ đọc. –
hash.collect {|a, b| [a, hash[a].collect {|c,d| [c,d]}] }.collect {|e,f| [e => f]}
Đây là một cách khác để làm điều này:
hsh = {:a => {"aa" => 11,"ab" => 12}, :b => {"ba" => 21,"bb" => 22}}
hsh.each{|k,v| hsh[k]=*v}
# => {:a=>[["aa", 11], ["ab", 12]], :b=>[["ba", 21], ["bb", 22]]}
Nếu bạn đang làm việc với băm đa cấp và bạn muốn flatten họ kiểm tra ra khỏi đá quý HashModel của tôi: https://rubygems.org/gems/hashmodel và bạn có thể lấy mã nguồn trên github: https://github.com/mi kbe/hashmodel –