Hash.delete_if返回删除的元素?

时间:2012-12-13 14:39:57

标签: ruby-on-rails ruby hash

从哈希relations我想删除一些条目,并将我删除的条目保留在另一个哈希obj中。

我找到Hash.delete_if并做了:

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

但是,它不会返回被删除的内容,而是返回删除的内容。

是否有方法可以做到这一点?

3 个答案:

答案 0 :(得分: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]}

答案 1 :(得分:2)

试试这个:

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

答案 2 :(得分: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课程并将该方法放在那里。