2013-04-23 64 views
1
array = 
[ { 
     :keyword => "A", 
     :total_value => "10" 
    }, 
    { 
     :keyword => "B", 
     :total_value => "5" 
    }, 
    { 
     :keyword => "C", 
     :total_value => "15" 
    }, 
    { 
     :keyword => "B", 
     :total_value => "6" 
    }, 
    { 
     :keyword => "A", 
     :total_value => "50" 
    }, 
    { 
     :keyword => "D", 
     :total_value => "40" 
    }, 
    { 
     :keyword => "A", 
     :total_value => "30" 
    }] 

我正在嘗試合併具有相同:keyword值的哈希值。通過鞏固,我的意思是結合:total_value。例如,在整合...具有相同符號值的組合哈希值

new_array = 
[ { 
     :keyword => "A", 
     :total_value => "90" 
    }, 
    { 
     :keyword => "B", 
     :total_value => "11" 
    }, 
    { 
     :keyword => "C", 
     :total_value => "15" 
    }, 
    { 
     :keyword => "D", 
     :total_value => "40" 
    }] 
+3

你不斷地問[同](http://stackoverflow.com/ q/16157699/479863)[問題](http://stackoverflow.com/q/16156691/479863)以略微不同的形式重複。爲什麼不在其他變體的答案在這裏工作? – 2013-04-23 17:10:03

+1

原始答案對我提供的數據是正確的。但是,我錯誤地提出了這個問題,並且解決方案沒有爲我的實際數據解決問題。我是ruby的新手,所以我不太瞭解如何爲我的數據定製解決方案。 – mnort9 2013-04-23 17:17:08

+0

爲了避免混淆,可能值得提及你以前的問題,並解釋這個問題是如何不同的。乍一看這可能並不明顯。一個簡單的方法是將所需的輸出放在第一位,然後再輸入數據。 – tadman 2013-04-23 18:58:10

回答

5

inject是你的朋友:

combined_keywords = array.inject(Hash.new(0)){|acc, oh| acc[oh[:keyword]] += oh[:total_value].to_i ; acc } 

另外,該each_with_object方法可能會更在這種情況下可讀:

combined_keywords = array.each_with_object(Hash.new(0)){|oh, newh| newh[oh[:keyword]] += oh[:total_value].to_i } 

上述兩種方法在功能上是等效的。

最後,如果你真的想這是數組的哈希值的風格,這將讓你有:

combined_keywords.collect{|(k,v)| {:keyword => k, :total_value => v}} 
+1

'each_with_object'有時候比'inject'鏈少混亂,但結構幾乎相同。 – tadman 2013-04-23 17:03:14

+0

謝謝,我總是忘記each_with_object。我已經擴大了答案以包含您的建議。 – 2013-04-23 17:08:49

+0

'inject'和'each_with_object'解決方案應該使用組合關鍵字作爲關鍵字來返回單個散列?對我來說,它輸出一個空的散列。 – mnort9 2013-04-23 17:10:51

0

我認爲這可能是這樣的

new_array = {} 
array.each do |hsh| 
    new_array[hsh[:keyword]] ||= 0 
    new_array[hsh[:keyword]] += hsh[:total_value].to_i 
end 
+0

這樣的輸出看起來更像'{「A」=> 90,「B」=> 11,「C」=> 15,「D」=> 40}',不是嗎?也許你會需要另一行來遍歷'new_array'中的鍵和值來生成所需的散列數組。 – pjmorse 2013-04-23 16:55:20

相關問題