【问题标题】:Add Hash Values in nested hash - Join Nested Hashes Ruby在嵌套哈希中添加哈希值 - Join Nested Hashes Ruby
【发布时间】:2013-12-17 03:03:36
【问题描述】:

我有两个哈希值..

[
    {
        "title"=>"CEO",
        "name"=>"George",
        "columns"=>[
      {
        "display_name"=> "Salary",
        "value"=>"3.85",
      }
    , {
        "display_name"=> "Bonus",
        "value"=>"994.19",
      }
    , {
        "display_name"=> "Increment",
        "value"=>"8.15",
       }
                    ]
    }
]


data2 = JSON.parse(data2)['info']
puts data2

[
    {
        "title"=>"CEO",
        "name"=>"George",
        "columns"=>[
      {
        "display_name"=> "Address",
        "value"=>"Albany",
      }
    , {
        "display_name"=> "Phone",
        "value"=>"47123",
      }
    , {
        "display_name"=> "Mobile",
        "value"=>"784123",
      }
                    ]
    }
]

如果在两个哈希中都满足 name = george 等条件,我想将“列”中的值加入一个哈希中

所需的输出是这样的

[
    {
        "title"=>"CEO",
        "name"=>"George",
        "columns"=>[
      {
        "display_name"=> "Salary",
        "value"=>"3.85",
      }
    , {
        "display_name"=> "Bonus",
        "value"=>"994.19",
      }
    , {
        "display_name"=> "Increment",
        "value"=>"8.15",
      }
    , {
        "display_name"=> "Address",
        "value"=>"Albany",
      }
    , {
        "display_name"=> "Phone",
        "value"=>"47123",
      }
    , {
        "display_name"=> "Mobile",
        "value"=>"784123",
      }
                      ]
    }
]

我尝试过的是压缩、合并、注入、连接、哈希深度合并,但我能得到的最好的方法是丢弃所有第一个值并存储第二个的新哈希

【问题讨论】:

  • 我会说您需要为每条记录提供一个标识符,以便在合并时进行比较。
  • "name"=>"George" - 可能是标识符?或匹配器 - 两者中的 id 名称相同然后将列的值转储到第一个哈希中...

标签: ruby-on-rails ruby hash merge nested


【解决方案1】:

您可以使用Array#| 合并两个数组:

data.each do |item|
    # find matching entry in data2
    item2 = data2.find {|item2| item2['name'] == item['name'] }
    # join both columns if matching data was found
    item['columns'] = item['columns'] | item2['columns'] if item2
end

这会修改您的 data 变量以包含 datadata2 的列。

=> [{"title"=>"CEO",
  "name"=>"George",
  "columns"=>
   [{"display_name"=>"Salary", "value"=>"3.85"},
    {"display_name"=>"Bonus", "value"=>"994.19"},
    {"display_name"=>"Increment", "value"=>"8.15"},
    {"display_name"=>"Address", "value"=>"Albany"},
    {"display_name"=>"Phone", "value"=>"47123"},
    {"display_name"=>"Mobile", "value"=>"784123"}]}]

item2 = data2.find {|item2| item2['name'] == item['name'] } 中的块定义了两个项目是否相等。如果您愿意,您可以修改该块以比较其他值(例如title)。


我认为datadata2 是这样定义的:

data= [
    {"title"=>"CEO",
    "name"=>"George",
    "columns"=>[
        {
            "display_name"=> "Salary",
            "value"=>"3.85",
        }, {
            "display_name"=> "Bonus",
            "value"=>"994.19",
        }, {
            "display_name"=> "Increment",
            "value"=>"8.15",
        }
    ]}
  ]

data2 = [{
    "title"=>"CEO",
    "name"=>"George",
    "columns"=>[{
        "display_name"=> "Address",
        "value"=>"Albany",
    }, {
        "display_name"=> "Phone",
        "value"=>"47123",
    }, {
        "display_name"=> "Mobile",
        "value"=>"784123",
    }]
}]

【讨论】:

  • 非常感谢...您的输出是否有初始标题、名称等...似乎缺少...
  • 您希望titlename 等在哪里?这些关联仍然存在于原始的data 数组中。
  • 您应该运行整个程序,从data.each 开始,直到end。您引用的赋值仅返回列哈希,但它会根据需要修改 data 变量。
  • 要在一行中保存到 CSV,这可行... File.open("data.csv", "w") {|f| f.write(data.inject([]) { |csv, row| csv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多