6

我正在寻找一种将“json”散列展平为展平散列但将路径信息保留在展平键中的方法。例如:

h = {"a" => "foo", "b" => [{"c" => "bar", "d" => ["baz"]}]}

flatten(h) 应该返回:

{"a" => "foo", "b_0_c" => "bar", "b_0_d_0" => "baz"}
4

2 回答 2

16

这应该可以解决您的问题:

h = {'a' => 'foo', 'b' => [{'c' => 'bar', 'd' => ['baz']}]}

module Enumerable
  def flatten_with_path(parent_prefix = nil)
    res = {}

    self.each_with_index do |elem, i|
      if elem.is_a?(Array)
        k, v = elem
      else
        k, v = i, elem
      end

      key = parent_prefix ? "#{parent_prefix}.#{k}" : k # assign key name for result hash

      if v.is_a? Enumerable
        res.merge!(v.flatten_with_path(key)) # recursive call to flatten child elements
      else
        res[key] = v
      end
    end

    res
  end
end

puts h.flatten_with_path.inspect
于 2012-05-23T07:23:06.880 回答
0

我有一个类似的问题,并在此处提出了 在 Ruby中使用可能的解决方案从分层 JSON 中生成扁平化 JSON(非规范化)的最佳方法

我的解决方案是最佳解决方案还是有更好的方法?

于 2015-01-09T16:05:22.670 回答