【问题标题】:Flatten hash with two identical key names(array)用两个相同的键名(数组)展平散列
【发布时间】:2012-09-04 19:14:10
【问题描述】:

我喜欢这里显示的方法 - https://stackoverflow.com/a/9648410/1646893,我想在我的情况下使用它。 如果我们有这样的东西怎么办:

{"a"=>{"b"=>"111", "c"=>"9", "d"=>{"ff"=>{"uu"=>[{"q"=>"77", "r"=>{"w"=>"66"}, "j"=>{"@l"=>"44"}}, {"q"=>"78", "r"=>{"w"=>"67"}, "j"=>{"@l"=>"45"}}]}, "@e"=>"56"}, "@b1"=>"01", "@b2"=>"02", "@b3"=>"03"}}

当我尝试使用我们的方法时:

{["a", "b"]=>"111", ["a", "c"]=>"9", ["a", "d", "ff", "uu"]=>[{"q"=>"77", "r"=>{"w"=>"66"}, "j"=>{"@l"=>"44"}}, {"q"=>"78", "r"=>{"w"=>"67"}, "j"=>{"@l"=>"45"}}], ["a", "d", "@e"]=>"56", ["a", "@b1"]=>"01", ["a", "@b2"]=>"02", ["a", "@b3"]=>"03"}

结果是一个有 2 个值的数组:

[{"q"=>"77", "r"=>{"w"=>"66"}, "j"=>{"@l"=>"44"}}, {"q"=>"78", "r"=>{"w"=>"66"}, "j"=>{"@l"=>"44"}}]

这是我想要的:

["a", "d", "ff", "uu", "q0", "w0", "j0", "@l0"]=>"44"

等等

也许我应该在使用 flat_hash 方法之前更改键名? 我应该怎么做才能得到不包含数组和键名的结果?

【问题讨论】:

  • 必须有一个关系才能得到想要的结果
  • 出于好奇:你到底为什么想要这个?将数组中拥有对象的索引与子对象的键名结合起来有什么好处?如果有什么我想你会想要的:["a","d","ff","uu","q",0,"w","j","@l"]=>"44"
  • 请注意(如我的示例输出和示例输入的重新格式化所示)您所拥有的与您想要的不完全对应:w 绝不是q 的孩子。跨度>
  • 对不起,这是我的第一个问题。以后我会尝试更准确地提出问题。

标签: ruby arrays hash


【解决方案1】:

这是我的答案,我相信它会产生比您要求的更好的输出。如果您绝对迫切需要您所要求的输出,请说出来,也许我会提供一个产生它的变体。

class Hash;  def each_with_key; each{ |k,v|            yield(v,k) }; end; end
class Array; def each_with_key; each.with_index{ |v,i| yield(v,i) }; end; end

def path_to_values(hash)
  {}.tap do |result|
    crawl = ->(o,chain=[]) do
      o.each_with_key do |v,k|
        path = chain + [k]
        (v.is_a?(Hash) || v.is_a?(Array)) ? crawl[v,path] : result[path] = v
      end
    end
    crawl[hash]
  end
end

实际操作:

h = {
  "a" => {
    "b"=>"111", "c"=>"9",
    "d"=>{
      "ff"=>{
        "uu"=>[
          { "q"=>"77",
            "r"=>{"w"=>"66"},
            "j"=>{"@l"=>"44"}},
          { "q"=>"78",
            "r"=>{"w"=>"67"},
            "j"=>{"@l"=>"45"}}
        ]
      },
      "@e"=>"56"
    },
    "@b1"=>"01", "@b2"=>"02", "@b3"=>"03"
  }
}
require 'pp'
pp path_to_values(h)
#=> {["a", "b"]=>"111",
#=>  ["a", "c"]=>"9",
#=>  ["a", "d", "ff", "uu", 0, "q"]=>"77",
#=>  ["a", "d", "ff", "uu", 0, "r", "w"]=>"66",
#=>  ["a", "d", "ff", "uu", 0, "j", "@l"]=>"44",
#=>  ["a", "d", "ff", "uu", 1, "q"]=>"78",
#=>  ["a", "d", "ff", "uu", 1, "r", "w"]=>"67",
#=>  ["a", "d", "ff", "uu", 1, "j", "@l"]=>"45",
#=>  ["a", "d", "@e"]=>"56",
#=>  ["a", "@b1"]=>"01",
#=>  ["a", "@b2"]=>"02",
#=>  ["a", "@b3"]=>"03"}

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多