【问题标题】:Reconstructing a Hash, naming and replacing issue重建哈希,命名和替换问题
【发布时间】:2014-01-23 22:06:28
【问题描述】:

我收到一个基于字符串的Hash,如下所示:

"data"=>{"uno"=>"alfa", "dos"=>"beta"}

我想重构它,使其具有以下对象结构命名

beta: {uno: "alfa"}

我已经陷入了获取内部值并将其转换为键的问题。任何达到上述目的的帮助将不胜感激。

更新
这里发生了几件事,我很遗憾做了一个问题。但现在因为它已经在野外,我会尽力进一步解释。
1. 按键需要转换为符号
2."dos"=>"beta"这对应该倒置
3. 上述对的倒置键应接管角色(来自"data")作为整个Hash的键

附言。由于我似乎无法清楚地解释我的问题,请随意投反对票。

【问题讨论】:

  • 我不明白你重构的逻辑!你能准确解释一下你想用你的初始哈希做什么吗?
  • 那些键(uno,dos)是固定值吗?否则,“反转” beta 和数据背后的逻辑是什么?

标签: ruby hashmap hashtable


【解决方案1】:

试试代码:

h.reduce({}) { |hh,v| hh[ v[1][ 'dos' ].to_sym ] = { :uno => v[1][ 'uno' ] } ; hh }
# => {:beta=>{:uno=>"alfa"}} 

【讨论】:

    【解决方案2】:

    如果您只想将键从字符串转换为符号,请使用:

    hash.inject({}){|h,(k,v)| h[k.to_sym] = v; h}
    

    这样做会返回:{data: {uno: "alfa", dos: "beta"}}

    【讨论】:

      【解决方案3】:

      你可能想试试这个:

      转换为 Ruby 哈希的简单方法是将字符串转换为 eval,但这是危险。所以我们可以使用更安全的方式:

      >> s = '"data"=>{"uno"=>"alfa", "dos"=>"beta"}'
      => ""data"=>{"uno"=>"alfa", "dos"=>"beta"}"
      
      >> require 'json'
      => true
      
      >> t2 = "{#{s}}".gsub('=>', ':')
      => "{"data":{"uno":"alfa", "dos":"beta"}}"
      
      >> h1 = JSON.parse(t2).to_hash
      => {"data"=>{"uno"=>"alfa", "dos"=>"beta"}}
      
      >> {:data => h1["data"].inject({}){|h,(k,v)| h[k.to_sym] = v; h}}
      => {:data=>{:uno=>"alfa", :dos=>"beta"}}
      

      此外,如果您提供更多示例来说明您期望的行为,那就更好了。

      【讨论】:

        猜你喜欢
        • 2012-03-15
        • 2015-12-03
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 2017-12-19
        • 2020-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多