Ruby on rails ruby中的深度压缩嵌套哈希?
给定以下哈希结构Ruby on rails ruby中的深度压缩嵌套哈希?,ruby-on-rails,ruby,hash,Ruby On Rails,Ruby,Hash,给定以下哈希结构 { a: nil, b: [], c: {c1: {c2: nil}}, d: [{d1: "Value!"}], e: "Value!", f: {f1: {f2: nil, f3: "Value!"}} } 我希望能够返回 { d: [{d1: "Value!"}], e: "Value!", f: {f1: {f3: "Value!"}} } 所以规则应该是 1) 删除指向nil、{}或[]值的任何键 2) 删除任何指向空值的值的键
{
a: nil,
b: [],
c: {c1: {c2: nil}},
d: [{d1: "Value!"}],
e: "Value!",
f: {f1: {f2: nil, f3: "Value!"}}
}
我希望能够返回
{
d: [{d1: "Value!"}],
e: "Value!",
f: {f1: {f3: "Value!"}}
}
所以规则应该是1) 删除指向
nil
、{}
或[]
值的任何键2) 删除任何指向空值的值的键(例如原始哈希中的
c:
)3) 如果一个或多个内部键指向非空值,则保留外部键,但删除指向空值的内部键。(请参见
f:
并注意f2:
已删除)
任何帮助都将不胜感激 通过monkey修补所涉及的核心类,您可以获得一些乐趣:
class Object
def crush
self
end
end
class Array
def crush
r = map(&:crush).compact
r.empty? ? nil : r
end
end
class Hash
def crush
r = each_with_object({ }) do |(k, v), h|
if (_v = v.crush)
h[k] = _v
end
end
r.empty? ? nil : r
end
end
这是一件不寻常的事情,但是如果您确实需要完成,那么编写一个像
crush
这样的方法可能会有所帮助。您可以从monkey修补涉及的核心类中获得一些乐趣:
class Object
def crush
self
end
end
class Array
def crush
r = map(&:crush).compact
r.empty? ? nil : r
end
end
class Hash
def crush
r = each_with_object({ }) do |(k, v), h|
if (_v = v.crush)
h[k] = _v
end
end
r.empty? ? nil : r
end
end
def deep_compact(hash)
res_hash = hash.map do |key, value|
value = deep_compact(value) if value.is_a?(Hash)
value = nil if [{}, []].include?(value)
[key, value]
end
res_hash.to_h.compact
end
这是一件不寻常的事情,但是如果您确实需要完成,那么编写一个类似于
crush
的方法可能会有所帮助。这应该是一个单次操作,可以处理嵌套数组和散列:
def deep_compact(hash)
res_hash = hash.map do |key, value|
value = deep_compact(value) if value.is_a?(Hash)
value = nil if [{}, []].include?(value)
[key, value]
end
res_hash.to_h.compact
end
def压碎(东西)
if thing.u是?(数组)
事物。每个带有对象([])的对象都做v,a|
v=挤压(v)
a这应该是一个单程操作,可用于嵌套数组和散列:
def压碎(东西)
if thing.u是?(数组)
事物。每个带有对象([])的对象都做v,a|
v=挤压(v)
a好的。你试图解决这个问题的方法是什么?你的解决方案有什么问题?好的。你试图解决这个问题的方法是什么?您的解决方案有哪些问题?我喜欢这种方法。它似乎与数组#crush方法例外。具有散列且键为空值的数组不会被压缩。我要玩一会儿,看看我能不能让它像这样工作。它似乎与数组#crush方法例外。具有散列且键为空值的数组不会被压缩。我将玩一会儿,看看是否能让它工作。这个函数递归地压缩输入哈希。这个函数递归地压缩输入哈希。工作正常!谢谢分享。工作很好!谢谢分享。