2012-12-13 27 views
1

從哈希relations我想刪除一些條目,並保留我在另一個哈希obj刪除的條目。Hash.delete_if返回已移除的元素?

我發現Hash.delete_if並做:

obj = relations.delete_if{|k,v| v[:value] == 1} 

然而,而不是返回被刪除的,它將返回刪除的人。

有沒有這樣的方法?

+1

試着用'select'? :'obj_with_value_eq_one = relations.select {| k,v | v [:value] == 1}' – MrYoshiji

+0

@MrYoshiji:是的,但是刪除部分呢? –

回答

2

試試這個:

another_hash = {} 
relations.delete_if{|k,v| v == 1 ? another_hash[k] = v; true : false} 
0

我不知道這樣做的內置方法,但自己構建方法是微不足道的。

def delete_and_return relations, &block 
    [relations.reject(&block), relations.select(&block)] 
end 


relations = { 
    a: {value: 1}, 
    b: {value: 2}, 
    c: {value: 1}, 
} 



kept, deleted = delete_and_return(relations) {|k,v| v[:value] == 1} 

kept # => {:b=>{:value=>2}} 
deleted # => {:a=>{:value=>1}, :c=>{:value=>1}} 

你甚至可以打開Hash類,並把方法放在那裏。

3

您可以使用partition method

{x: 1, y: 0, z: 2, t: 1}.partition {|k, v| v == 1} 
# => [[[:x, 1], [:t, 1]], [[:y, 0], [:z, 2]]] 

那麼你將不得不把結果返回到哈希值,以便您可以使用Hash[] method

{x: 1, y: 0, z: 2, t: 1}.partition{|k, v| v == 1}.map{|h| Hash[h]} 
# => [{:x => 1, :t => 1}, {:y => 0, :z => 2}] 

所以做你是什麼問:

obj, relations = relations.partition{|k, v| v[:value] == 1}.map{|h| Hash[h]}