从 Hashrelations
我想删除一些条目并将我删除的条目保留在另一个 Hashobj
中。
我发现Hash.delete_if
并做到了:
obj = relations.delete_if{|k,v| v[:value] == 1}
但是,它不是返回已删除的,而是返回未删除的。
有没有一种方法可以做到这一点?
从 Hashrelations
我想删除一些条目并将我删除的条目保留在另一个 Hashobj
中。
我发现Hash.delete_if
并做到了:
obj = relations.delete_if{|k,v| v[:value] == 1}
但是,它不是返回已删除的,而是返回未删除的。
有没有一种方法可以做到这一点?
您可以使用以下partition
方法:
{x: 1, y: 0, z: 2, t: 1}.partition {|k, v| v == 1}
# => [[[:x, 1], [:t, 1]], [[:y, 0], [:z, 2]]]
然后,您必须将结果转换回哈希值,您可以使用以下Hash[]
方法:
{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]}
试试这个:
another_hash = {}
relations.delete_if{|k,v| v == 1 ? another_hash[k] = v; true : false}
我不知道执行此操作的内置方法,但自己构建方法很简单。
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
课程并将方法放在那里。