2015-07-20 92 views
0

的值在我的散列的陣列使用#選擇要麼嵌套散列:在任一個散列或散列

test_multiple_hash = { test: { another_test: 123 } } 

或散列的數組:

test_multiple_hash = { test: [{ another_test: 123 }, { another_test: 124 }] } 

具有取出一個後值,我需要使用#選擇查找特定的嵌套哈希:

test_multiple_hash[:test].select { |s| s[:another_test] == 123 } 

如果我的哈希只有一個散列,然後除非將單個散列轉換爲數組,否則不適合我的需要。

當散列中的某個鍵的值是單個散列或散列數組時,有沒有更好的方法通過鍵的值來查找對象?

+0

什麼是'test_multiple_hash'? – sawa

+0

酷,downvote沒有理由爲什麼? – Bodao

+0

用更簡單的(嵌套散列)情況,你的預期結果是什麼? – sawa

回答

1

你可以做

[my_hash[:test]].flatten.select { |s| s[:another_test] == 123 } 
+0

此套件是我對這個特定問題的需求,其他解決方案也可以做到這一點,對於上面的問題更清潔!感謝您的建議!我現在正在申請=) – Bodao

2

我建議你開始做通用模式的所有基本價值:

hash = { test: { another_test: 123 }, 
     test2: { test: [{ another_test: 123 }, { another_test: 124 }] } 
     } 

hash.map { |k, v| [k, [*v]] }.to_h # now all of them are arrays. 

然後做你想做的,假設值是絕對的陣列,即摹:

hash.map do |k, v| 
    [k, [*v]] 
end.to_h[:test].select do |s| 
    s[:another_test] == 123 
end 
+0

非常感謝,這確實幫助我解決了我的問題,並幫助我實現了在整個代碼庫中處理不同數據模型的有效方法...... – Bodao

1

方法Kernel#Array將其參數轉換爲數組:

2.2.1 :002 > Array(1) 
=> [1] 

除非參數已經是一個數組;然後返回參數不變:

2.2.1 :003 > Array([1]) 
=> [1] 

所以,你可以使用Array函數強制test_multiple_hash[:test]是一個數組:

Array(test_multiple_hash[:test]).select { |s| s[:another_test] == 123 } 

#選擇的結果將始終是一個數組,即使test_multiple_hash[:test]不是一個數組。