修改对 Ruby 中散列值的引用
Modifying reference to hash value in Ruby
我是 Ruby 的新手,我有一个 JSON 数据集,我正在使用 stympy's Faker 对其进行去标识化处理。我更愿意通过引用更改散列中的值。
我试过更改作业,例如。 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
好的,这是一个很好的学习练习!
我遇到的问题分为两个部分:
JSON.parse
的 JSON 输出是一个散列,但散列存储数组,所以我的代码被破坏了。查看上面的示例数据行,它包含一些空数组:... [],[],[] ...
.
我误解了 each 是如何使用哈希的,我假设 key, value
(类似于 jquery each),但实际上每个语句中的 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
}
}
我是 Ruby 的新手,我有一个 JSON 数据集,我正在使用 stympy's Faker 对其进行去标识化处理。我更愿意通过引用更改散列中的值。
我试过更改作业,例如。 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
好的,这是一个很好的学习练习!
我遇到的问题分为两个部分:
JSON.parse
的 JSON 输出是一个散列,但散列存储数组,所以我的代码被破坏了。查看上面的示例数据行,它包含一些空数组:... [],[],[] ...
.我误解了 each 是如何使用哈希的,我假设
key, value
(类似于 jquery each),但实际上每个语句中的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
}
}