【问题标题】:Ruby Hash Values is Array, need to convert to stringRuby Hash Values 是数组,需要转成字符串
【发布时间】:2017-01-04 16:11:58
【问题描述】:

我有一个整数哈希作为键和字符串数组作为值。我需要将其转换为一个新的哈希,该哈希与原始哈希值中的字符串数组中的每个项目反转这种关系,成为新哈希中的一个键,每个原始键成为关联值。例如:

original = {1 => ['a', 'b', 'c'], 2 => ['g', 'm', 'z']}

new_hash = {'a' => 1, 'b' => 1, 'c' => 1, 'g' => 2, 'm' => 2, 'z' => 2}

我正在努力从原始数组值中提取项目。这很容易做到

original.each { |k, v| new_hash[v] = k }

但这会将原始数组保留为新键。我试过做类似的事情

original.each { |k, v| new_hash[v.each { |i| i }] = k }

但由于某种原因,这也会返回原始数组。

【问题讨论】:

    标签: arrays ruby hash


    【解决方案1】:

    另一个,通过Array#product

    original.flat_map { |k, v| v.product([k]) }.to_h
    #=> {"a"=>1, "b"=>1, "c"=>1, "g"=>2, "m"=>2, "z"=>2}
    

    【讨论】:

    • 所有的反应都很棒,但这似乎是最“红宝石”的方式。非常感谢您向我介绍产品方法。
    【解决方案2】:
    original.flat_map { |k, vs| vs.map { |v| {v => k} } }.reduce(&:merge)
    

    【讨论】:

      【解决方案3】:

      下面的 sn-p 会给出你想要的,但让我想一个更易读和优雅的解决方案。

      newhash = {}
      
      original.each do |k,v|
        v.each do |v2|
          newhash[v2] = k
        end
      end
      #=> {1=>["a", "b", "c"], 2=>["g", "m", "z"]}
      
      newhash
      #=> {"a"=>1, "b"=>1, "c"=>1, "g"=>2, "m"=>2, "z"=>2}
      

      【讨论】:

      • original.each_with_object({}) { |(k, vs), h| vs.each { |v| h[v] = k } } 可以工作。
      • 我正在寻找合适方法的文档。需要记住以下内容 -))
      【解决方案4】:

      你的方法很接近。将新的键/值对分配给 newHash 时,您必须迭代 values 数组中的每个元素

      newHash = {}
      original.each { |k, v| v.each {|i| newHash[i] = k}}
      

      【讨论】:

        【解决方案5】:
        original.map { |number, ary| Hash[ary.map { |char| [char, number] }] }.reduce(&:merge)
        

        【讨论】:

          猜你喜欢
          • 2016-08-31
          • 2021-08-06
          • 2013-09-26
          • 1970-01-01
          • 2015-11-06
          • 2010-10-21
          • 1970-01-01
          • 2011-06-22
          • 2011-03-30
          相关资源
          最近更新 更多