Ruby on rails 遍历散列。然而,我的价值观每次都在变化

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,

我目前正在处理一个简单的哈希循环,以操作一些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, "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