Ruby on rails 遍历散列。然而,我的价值观每次都在变化
我目前正在处理一个简单的哈希循环,以操作一些json数据。以下是我的Json数据:Ruby on rails 遍历散列。然而,我的价值观每次都在变化,ruby-on-rails,json,Ruby On Rails,Json,我目前正在处理一个简单的哈希循环,以操作一些json数据。以下是我的Json数据: { "polls": [ { "id": 1, "question": "Pensez-vous utiliser le service de cordonnerie/pressing au moins 2 fois par mois ?" }, { "id": 2, "question": "Avez-vous passé une bonne semaine ?" }, { "id": 3,
{
"polls": [
{ "id": 1, "question": "Pensez-vous utiliser le service de cordonnerie/pressing au moins 2 fois par mois ?" },
{ "id": 2, "question": "Avez-vous passé une bonne semaine ?" },
{ "id": 3, "question": "Le saviez-vous ? Il existe une journée d'accompagnement familial." }
],
"answers": [
{ "id": 1, "poll_id": 1, "value": true },
{ "id": 2, "poll_id": 3, "value": false },
{ "id": 3, "poll_id": 2, "value": 3 }
]
}
我想要poll_id值和answers散列中的值。下面是我的代码:
require 'json'
file = File.read('data.json')
datas = JSON.parse(file)
result = Hash.new
datas["answers"].each do |answer|
result["polls"] = {"id" => answer["poll_id"], "value" => answer["value"]}
end
polls_json = result.to_json
但是,它返回给我:
{
"polls": {
"id": 2,
"value": 3
}
}
以下是我想要的输出:
{
"polls": [
{
"id": 1,
"value": true
},
{
"id": 2,
"value": 3
},
{
"id": 3,
"value": false
}
]
}
似乎该值没有保存到我的循环中。我试过不同的方法,但还是找不到解决办法。。有什么建议吗?试试下面的方法:
require 'json'
file = File.read('data.json')
datas = JSON.parse(file)
result = Hash.new
poll_json = []
datas["answers"].each do |answer|
poll_json << {"id" => answer["poll_id"], "value" => answer["value"]}
end
p "json = "#{poll_json}"
require'json'
file=file.read('data.json')
datas=JSON.parse(文件)
结果=Hash.new
poll_json=[]
数据[“答案”]。每个都有答案|
轮询json应答[“轮询id”],“值”=>应答[“值”]}
结束
p“json=“#{poll_json}”
通常使用.map
迭代数组和散列并返回新对象。仅当您只关心副作用时(如在输出值的视图中),才应使用每个
输出为:
{"polls":[{"id":1,"value":true},{"id":3,"value":false},{"id":2,"value":3}]}
您应该在此处使用
reduce
,即
datas["answers"].reduce({ polls: [] }) do |hash, data|
hash[:polls] << { id: data["poll_id"], value: data["value"] }
hash
end
这是实现您所期望的最干净的方法,使用一个专门构建的方法
reduce
的文档如下:
(我也倾向于更新变量名——数据已经是复数形式,所以“datas”对其他人来说有点让人困惑。)
编辑:@max非常重视从您的数据中重新标记/字符串键-如果您试图应用它,请记住这一点。成功了!非常感谢。但是,我认为这里不需要结果,对吗?嗯,还有一些……我希望poll_json有一个名称“polls”。就像在我的代码中,
result[“polls”]
。(如果我没有说清楚,试着在你的控制台中运行我的代码)有什么想法吗?这是因为你正在哈希对象中保存数组,每次对象的值被覆盖时,你可以重命名轮询而不是轮询。\u json你可以给出一个所需输出的示例吗?(作为代码,请编辑问题。)是的,当然!我不明白…我在哪里运行代码,我有一个空的哈希。如果你将哈希从你的问题复制到ruby,那么如果你解码JSON,这些键将是符号,而它们将是字符串。因为哈希并不无关紧要,它们将给出不同的结果。如果你将其更改为datas[:answers]。map{{id:a[:poll\u id],value:a[:value]}
它将给出与符号键相同的结果。嗯,还有一件事。让我们假设我的Json对一个轮询id有多个答案。我应该仍然使用map方法吗?例如id=2有两个答案,我是否必须循环value:a[:value]}
?然后你会使用reduce。哇,谢谢你的解释,它比以前更清晰了!我目前正在尝试使用你的代码。但是,我认为我做了一些错误的事情,因为它返回了一个空哈希。你能帮我吗?我想这将归结为前面提到的关于字符串化/符号的内容ed键。:轮询将始终是一个符号,但如果执行JSON.parse(您的_数据)
操作,则键将是字符串(如答案所示),否则它们将是符号(即{id:data[:poll\u id],value:data[:value]}
)。看看这是否有帮助!这是我的错误,我的错。不管怎样,谢谢你的回答!我还有一个问题…你介意我更新我的问题来告诉你我的问题是什么吗?我在internet/stack上找不到任何解决方案,我认为reduce方法是最好的方法。
{"polls":[{"id":1,"value":true},{"id":3,"value":false},{"id":2,"value":3}]}
datas["answers"].reduce({ polls: [] }) do |hash, data|
hash[:polls] << { id: data["poll_id"], value: data["value"] }
hash
end
datas["answers"].reduce({ polls: [] }) do |hash, data|
hash.tap { |h| h[:polls] << { id: data["poll_id"], value: data["value"] } }
end