【问题标题】:How to fix an "each" loop that doesn't work如何修复不起作用的“每个”循环
【发布时间】:2016-11-22 14:14:51
【问题描述】:

我有一个文件:

{
  "total": 0,
  "subtotal": 807,
  "page": 1,
  "per_page": 1000,
  "search": "hostname",
  "sort": {
    "by": null,
    "order": null
  },
  "results": {
    "aaa-test01.myname.com":{
      "hostname":"aaa-test01",
      "networking":"{\"hostname\"=>\"aaa-test01\", \"mtu\"=>1500, \"netmask\"=>\"255.255.255.224\", \"primary\"=>\"eth0\"}"
      }, 
    "osilek":{
      "networking":"{\"hostname\"=>\"osilek.myname.com\", \"mtu\"=>1500, \"netmask\"=>\"255.255.255.128\", \"netmask6\"=>\"ffff:ffff:ffff:ffff::\",\"primary\"=>\"eth1\"}"
    }
  }
}

我想要这样的哈希:

g = {"aaa_test01.myname.com"=> "aaa-test01", "osilek.myname.com" => "osilek"}

此哈希中的键必须与结果中的键相同,值必须与结果中的主机名值相同。

我有这个代码:

#!/usr/bin/ruby

require 'rubygems'
require 'json'

data = JSON.load File.new("any.txt")
results = data["results"]

results.each do |key, hash|
         hash.select! {|k,v| k == "networking"}
end
results.each do |key, h|
    h.each do |key, hash|
        #puts hash.select! {|k,v| k == "hostname"}
        hash = JSON.parse hash.gsub('=>', ':')
        hash.select! {|k,v| k == "hostname"}
        new_h = h.inject({}) {|new_h, (k,v)| new_h.merge(key => hash.values)}
        puts g = results.inject({}) {|g, (key, new_h)| g.merge(key => new_h.values)}
    end
end

new_h = h.inject({}) {|new_h, (k,v)| new_h.merge(key => hash.values)}

一切正常,我明白了

new_h = {{"networking"=>["aaa-test01"]}, {"networking"=>["osilek"]}}

但在下一步中,我在进入循环之前得到了results 散列而不是g 散列。循环不好用,我也不知道为什么。

【问题讨论】:

  • 您的new_h = = h.inject({}) ... 是未使用的变量。
  • 好的,那怎么解决呢?
  • 我只是在工作。你确定应该是"osilek.myname.com" => "osilek" 而不是"osilek" => "osilek.myname.com"?因为"aaa_test01.myname.com"=> "aaa-test01"
  • 如果您的意思是 g 哈希,实际上并不重要。我想用这些变量来更新服务器上的数据,不管是先用值还是先用键。
  • 我可以向您保证,each 本身肯定可以工作。是你的代码有一两个错误。

标签: ruby hash each


【解决方案1】:

我不知道问题出在你的代码中,但你可以这样做:

任何.txt:

{
  "total": 0,
  "subtotal": 807,
  "page": 1,
  "per_page": 1000,
  "search": "hostname",
  "sort": {
    "by": null,
    "order": null
  },
  "results": {"aaa-test01.myname.com":{"hostname":"aaa-test01","networking":"{\"hostname\"=>\"aaa-test01\", \"mtu\"=>1500, \"netmask\"=>\"255.255.255.224\", \"primary\"=>\"eth0\"}"}, "osilek":{"networking":"{\"hostname\"=>\"osilek.myname.com\", \"mtu\"=>1500, \"netmask\"=>\"255.255.255.128\", \"netmask6\"=>\"ffff:ffff:ffff:ffff::\",\"primary\"=>\"eth1\"}"}}
 }

process.rb:

require 'json'

json = JSON.load(File.new("any.txt"))

export = json['results'].each_with_object({}) do |(k, h), exp|
  next unless h['networking']
  network = JSON.parse(h['networking'].gsub('=>', ':'))
  exp[k] = network['hostname'] unless network['hostname'].to_s.strip.empty?
end

p export
# {"aaa-test01.myname.com"=>"aaa-test01", "osilek"=>"osilek.myname.com"}

【讨论】:

    【解决方案2】:

    另一种方式:

    data['results'].inject({}) do |hash, (k, v)|
      fallback = JSON.parse(v['networking'].gsub('=>', ':'))['hostname']
      hash.merge("#{k}": v['hostname'] || fallback)
    end
    
    # {:"aaa-test01.myname.com"=>"aaa-test01", :osilek=>"osilek.myname.com"} 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      相关资源
      最近更新 更多