2011-12-15 35 views
1

我有,我想變成一個表散列的數組,但棘手的部分是哈希鍵並不一致:如何從沒有一致鍵的散列數組中生成表?

a = [ 
    { 
    "name" => "Jack", 
    "phone" => "9542221234", 
    "state" => "FL" 
    }, 
    { 
     "name" => "John", 
     "job" => "Lawyer" 
    }, 
    { 
     "name" => "Mike", 
     "campaign" => "test", 
     "state" => "NY" 
    } 
] 

我很茫然如何遍歷數組,拉出唯一的鍵名並將適用的值添加到行中。我想達到這樣的效果:

Name | Phone | State | Campaign | Job 
--------------------------------------------- 
Jack 9542221234 FL 
John         Lawyer 
Mike     NY  test 

我搜索了一個解決方案,看着不同的寶石,如生成器,但我發現每一個例子假定鍵名是一致的,拉從表頭鍵數組中的第一個散列。

+0

在獲取數據之前哈希鍵是否完全未知?或者,你是否知道你將在整個陣列中擁有一定的密鑰,而問題在於它們在哈希中並不總是被發現? –

+0

這些鍵本身是完全動態的,所以直到散列數組構造完畢纔有辦法知道。基本上它們是以散列形式保存的URL參數。雖然他們在大多數情況下是一致的,但在這種情況下,他們可以是任何東西都很重要。 – Ataraxy

回答

2
cols = a.map(&:keys).flatten.uniq 
cols.each do |colname| 
    printf "%-10s ", colname 
end 
puts 
a.each do |row| 
    cols.each do |colname| 
    printf "%-10s ", row[colname] 
    end 
    puts 
end 
+1

爲了這個工作,你需要將'cols'數組變平:'cols = a.map(&:keys).flatten.uniq'。這是我第一次看到'&:keys'我在哪裏可以找到關於這種快捷方式的更多信息?考慮到地圖通常不會有任何爭論。 –

+1

恕我直言'把「%-10s」%colname'比'printf'版本更習慣。 –

+1

thx Kassym!固定。邁克爾,這將把每個colname放在一個單獨的行中,我們不想要這個。 –

相關問題