【问题标题】:Modifying reference to hash value in Ruby在 Ruby 中修改对哈希值的引用
【发布时间】:2016-12-16 07:11:17
【问题描述】:

我是 Ruby 新手,我有一个 JSON 数据集,我正在使用 stympy's Faker 对其进行去标识化。我宁愿通过引用更改 Hash 中的值。

我尝试过更改分配,例如。 key['v] = namea[1]data['cachedBook']['rows'][key][value] = namea[1] 但我收到 no implicit conversion of Array into String 错误。这是有道理的,因为每个本身都是一个数组,但我不确定如何进行。

单行,例如data['cachedBook']['rows'] 看起来像这样:

    [{"v":"Sijpkes_PreviewUser","c":"LN","uid":"9######","iuid":"3####7","avail":true,"sortval":"Sijpkes_PreviewUser"},
{"v":"Paul","c":"FN","sortval":"Paul"},
{"v":"#####_previewuser","c":"UN"},
    {"v":"","c":"SI"},{"v":"30 June 2016","c":"LA","sortval":1467261918000},
    {"v":"Available","c":"AV"},[],[],[],[],[],[],
    {"v":"-","tv":"","numAtt":"0","c":"374595"},[],[],
    {"v":"-","tv":"","numAtt":"0","c":"374596"},[],[],[],
    {"v":0,"tv":"0.0","mp":840,"or":"y","c":"362275"},
    {"v":0,"tv":"0.0","mp":99.99999,"or":"y","c":"389721"}] 

键和值被解释为前两个条目。 敏感数据已通过####s 删除。

Ruby 代码:

data['cachedBook']['rows'].each do |key, value|
  fullname = Faker::Name.name
  namea = fullname.split(' ')

  str = "OLD: " + String(key['v']) + " " + String(value['v']) +"\n";
  puts str

  if ["Ms.", "Mr.", "Dr.", "Miss", "Mrs."].any? { |needle| fullname.include? needle  }
      key['v'] = namea[2]
      value['v'] = namea[1]
      value['sortval'] = namea[1]
  else
      key['v'] = namea[1]
      value['v'] = namea[0]
      value['sortval'] = namea[1]
  end

  str = "\nNEW: \nFullname: "+String(fullname)+"\nConverted surname: "+ String(key['v']) + "\n\t firstname: " + String(value['v'])
  puts str
end

puts data

【问题讨论】:

  • 您的代码看起来正确。我希望您的某些行可能有一些不同的结构。请仔细检查您的行数据并查看您在 key['v'] 和 value['v'] 处的内容。使用 puts 进行调试输出。 readysteadycode.com/howto-debug-your-ruby-code
  • 正确,@SunnyMagadan,我已经回答了我自己的问题。 JSON 对象中有多种类型,我也误解了每种类型在 Arrays 上的作用。

标签: ruby string reference hashmap blackboard


【解决方案1】:

好的,这是一个很好的学习练习!

我遇到的问题分为两部分:

  1. JSON.parse 的 JSON 输出是一个哈希,但哈希存储的是数组,所以我的代码被破坏了。查看上面的示例数据行,它包含一些空数组:... [],[],[] ...

  2. 我误解了 each 是如何使用 Hash 的,我假设 key, value(每个都类似于 jquery)但原始每个语句中的 key, value 实际上计算为前两个数组元素。

这是我修改后的代码:

data['cachedBook']['rows'].map! { |row|
  fullname = Faker::Name.name
  namea = fullname.split(' ')

  row.each { |val|

  if val.class == Hash
      newval = val.clone
        if ["Ms.", "Mr.", "Dr.", "Miss", "Mrs."].any? { |needle| fullname.include? needle  }
              if val.key?("c") && val["c"] == "LN"
                newval["v"] = namea[1]
                newval["sortval"] = namea[1]
              end
              if val.key?("c") && val["c"] == "FN"
                newval["v"] = namea[2]
                newval["sortval"] = namea[2]
              end
        else
            if val.key?("c") && val["c"] == "LN"
              newval["v"] = namea[0]
              newval["sortval"] = namea[0]
            end
            if val.key?("c") && val["c"] == "FN"
              newval["v"] = namea[1]
              newval["sortval"] = namea[1]
            end
        end
    val.merge!(newval)
  end
  }
}

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2016-12-31
    • 2021-12-07
    • 2012-04-25
    相关资源
    最近更新 更多