如何从Rails中的哈希列表中删除嵌套键
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从Rails中的哈希列表中删除嵌套键相关的知识,希望对你有一定的参考价值。
我现在正在尝试删除哈希列表的嵌套哈希键几个小时。我看到很多解决方案非嵌套哈希,如下所示:
sample_hash = {"key1" => "value1", "key2" => "value2"}
sample_hash.except("key1")
这导致:
{"key2"=>"value2"}
但是如果我尝试在带有嵌套键的哈希上使用except方法,那么它就不起作用了。这是我的代码:
nested_hash = {"key1"=>"value1", "key2"=>{
"nested_key1"=>"nestedvalue1",
"nested_key2"=>"nestedvalue2"
}
}
nested_hash.except("nested_key2")
except()方法返回nested_hash而不做任何更改。我已经找到了一个解决方案,我可以将嵌套的哈希键传递给except方法,但找不到任何东西。是否可以将嵌套键传递给此方法,还是应该使用其他方法从哈希列表中删除嵌套哈希键?
答案
关于什么
Hash[nested_hash.map {|k,v| [k,(v.respond_to?(:except)?v.except("nested_key2"):v)] }]
=> {"key1"=>"value1", "key2"=>{"nested_key1"=>"nestedvalue1"}}
啊。
另一答案
接受的解决方案对于给出的方案是有效的,但如果您正在寻找可以为任意嵌套的哈希表执行此操作的内容,那么您将需要递归解决方案。我无法在任何地方找到合适的解决方案,所以我写了一个here。
这里用注释转载:
class Hash
def except_nested(key)
r = Marshal.load(Marshal.dump(self)) # deep copy the hashtable
r.except_nested!(key)
end
def except_nested!(key)
self.except!(key)
self.each do |_, v| # essentially dfs traversal calling except!
v.except_nested!(key) if v.is_a?(Hash)
end
end
end
将它添加到Hash
类,以便您可以像调用除了/ except之外的方式调用它!其他地方。
t = { a: '1', b: { c: '3', d: '4' } }
r = t.except_nested(:c)
# r => {:a=>"1", :b=>{:d=>"4"}}
# t => {:a=>"1", :b=>{:c=>"3", :d=>"4"}}
t.except_nested!(:c)
# t => {:a=>"1", :b=>{:d=>"4"}}
另一答案
尝试
my_hash = Hash[nested_hash.map {|k,v| {k=>v.is_a? Array ? v.except("nested_key2") : v}}.map {|key, value| [key, value]}]
但这似乎不对,我希望我从未开始走这条路,我愿意打赌有一种更简单的方法!
以上是关于如何从Rails中的哈希列表中删除嵌套键的主要内容,如果未能解决你的问题,请参考以下文章