2014-02-05 184 views
2

如何根據ate密鑰的值將這個哈希數組分成兩部分?根據密鑰的值將散列數組分成兩部分

array = [ 
    { name: "Gad", ate: true }, 
    { name: "Lad", ate: false }, 
    { name: "Bad", ate: true }, 
    { name: "Sad", ate: false } 
] 

實施例輸出

array_1 = [ 
    { name: "Gad", ate: true }, 
    { name: "Bad", ate: true } 
] 
array_2 = [ 
    { name: "Lad", ate: false }, 
    { name: "Sad", ate: false } 
] 

回答

14

使用Enumerable#partition方法:

array.partition { |x| x[:ate] } 
# => [[{:name=>"Gad", :ate=>true}, {:name=>"Bad", :ate=>true}], 
#  [{:name=>"Lad", :ate=>false}, {:name=>"Sad", :ate=>false}]] 

或者:

array_1, array_2 = array.partition { |x| x[:ate] } 

array_1 
# => [{:name=>"Gad", :ate=>true}, {:name=>"Bad", :ate=>true}] 

array_2 
# => [{:name=>"Lad", :ate=>false}, {:name=>"Sad", :ate=>false}] 
+0

完美....... –

2
array_one, array_two = *array.group_by { |x| x[:ate] }.map(&:last) 

=> array_one 
=> # [{:name=>"Gad", :ate=>true}, {:name=>"Bad", :ate=>true}] 
=> array_two 
=> # [{:name=>"Lad", :ate=>false}, {:name=>"Sad", :ate=>false}] 

THX @CarySwoveland

2

我不能partition競爭,但這裏的另一種方式:

trues = array.select { |h| h[:ate] } 
falses = array - trues 
相關問題