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方法例外。具有散列且键为空值的数组不会被压缩。我将玩一会儿,看看是否能让它工作。这个函数递归地压缩输入哈希。这个函数递归地压缩输入哈希。工作正常!谢谢分享。工作很好!谢谢分享。