Ruby on rails Ruby数组构造
我有下面的jsonRuby on rails Ruby数组构造,ruby-on-rails,arrays,ruby,json,haml,Ruby On Rails,Arrays,Ruby,Json,Haml,我有下面的json { "items": [ { "name": "table", "item_group": [ { "code": "code1", "section": [ {
{
"items": [
{
"name": "table",
"item_group": [
{
"code": "code1",
"section": [
{
"unit": "centimeter",
"values": [
{
"display": "151.13 centimeter"
}
]
},
{
"unit": "centimeter (qualifier value)",
"values": [
{
"display": "170.39 centimeter"
}
]
}
],
"total": 2
}
],
"more_results": false,
"total": 1
}
]
}
我如何迭代并创建一个“值”数组。我想要像[151.13厘米,170.39厘米,…]这样的东西。请指出这方面的一些方向。谢谢
注意:我必须在Haml中执行此操作。假设您知道底层哈希的结构,您可以执行以下操作: 代码
require 'json'
JSON.parse(json_str)['items'].each_with_object([]) do |g,arr|
g['item_group'].each do |gg|
gg['section'].each do |ggg|
ggg['values'].each { |gggg|arr << gggg['display'][/\d+\.\d+/].to_f }
end
end
end
#=> [151.13, 170.39]
请注意,这个数组只有一个元素,一个包含散列的两元素数组和一个空数组
enum
的第一个元素被传递到块,并使用并行赋值分配给块变量:
g, arr = enum.next
#=> {"name"=>"table",
# "item_group"=>[
# {"code"=>"code1",
# "section"=>[
# {"unit"=>"centimeter",
# "values"=>[
# {"display"=>"151.13 centimeter"}
# ]
# },
# {"unit"=>"centimeter (qualifier value)",
# "values"=>[
# {"display"=>"170.39 centimeter"}
# ]
# }
# ],
# "total"=>2}],
# "more_results"=>false,
# "total"=>1}
arr #=> []
c = g['item_group']
#=> [{"code"=>"code1",
# "section"=>[
# {"unit"=>"centimeter",
# "values"=>[
# {"display"=>"151.13 centimeter"}
# ]
# },
# {"unit"=>"centimeter (qualifier value)",
# "values"=>[
# {"display"=>"170.39 centimeter"}
# ]
# }
# ],
# "total"=>2}]
注c
的格式为[hash]
c
的第一个(也是唯一一个)元素被传递到其块并分配给其块变量:
gg = c.first
d = gg['section']
#=> [{"unit"=>"centimeter",
"values"=>[
{"display"=>"151.13 centimeter"}
]
},
{"unit"=>"centimeter (qualifier value)",
"values"=>[
{"display"=>"170.39 centimeter"}
]
}
]
ggg = d.first
#=> {"unit"=>"centimeter",
# "values"=>[
# {"display"=>"151.13 centimeter"}
# ]
# }
e = ggg['values']
#=> [{"display"=>"151.13 centimeter"}]
gggg = e.first
#=> {"display"=>"151.13 centimeter"}
f = gggg['display']
#=> "151.13 centimeter"
g = f[/\d+\.\d+/]
#=> "151.13"
i = g.to_f
#=> 151.13
arr << i
#=> [151.13]
arr
#=> [151.13]
尽管我怀疑这样做会更有效率。我知道有多种方法可以做到这一点。但是如果您确实有许多复杂的JSON查询,您可以尝试。它非常快,因为它使用linux管道
require 'jq'
require 'jq/extend'
json_content = {
"items": [
{
"name": "table",
"item_group": [
{
"code": "code1",
"section": [
{
"unit": "centimeter",
"values": [
{
"display": "151.13 centimeter"
}
]
},
{
"unit": "centimeter (qualifier value)",
"values": [
{
"display": "170.39 centimeter"
}
]
}
],
"total": 2
}
],
"more_results": false,
"total": 1
}
]
}
jq_filter = ' .items | .[].item_group |.[].section| . [ ] .values | . [ ] .display'
final_array = json_content.jq(jq_filter)
# => final_array = ["151.13 centimeter", "170.39 centimeter"]
您可以这样做:
json.scan(/\“display\”:\“(\d+\.\d+)厘米/).flatte.map(&:to\u f)\=>[151.13170.39]
。您知道结构(即嵌套键等)吗或者你只是想通过嵌套的哈希和数组挖掘,直到找到一个看起来像你想要的字符串?我建议你用单引号将你的JSON字符串括起来,这样它就是一个字符串。你为什么要在haml中这样做?你能不能在控制器中转换这个逻辑,然后在haml中传递一个变量?是的,我已经有了“item\u”组“在一个物体上。所以我想遍历它,并将所有的“值”添加到一个数组中。我们可以说g['item_group']['section']['values']]而不是三个循环吗?问题是我在HamlYou中使用它,可能只需要一个循环,请看我的编辑。正如我提到的,这不太可能使该方法显著提高效率,但减少的循环可能会对您有所帮助。这很有趣,@Amit。请注意,您可以编写json_content.jq(jq_filter).map(&:to#f)=>[151.13170.39]
,因为“151.13我的狗有跳蚤”。to#f=>151.13
。
gg = c.first
d = gg['section']
#=> [{"unit"=>"centimeter",
"values"=>[
{"display"=>"151.13 centimeter"}
]
},
{"unit"=>"centimeter (qualifier value)",
"values"=>[
{"display"=>"170.39 centimeter"}
]
}
]
ggg = d.first
#=> {"unit"=>"centimeter",
# "values"=>[
# {"display"=>"151.13 centimeter"}
# ]
# }
e = ggg['values']
#=> [{"display"=>"151.13 centimeter"}]
gggg = e.first
#=> {"display"=>"151.13 centimeter"}
f = gggg['display']
#=> "151.13 centimeter"
g = f[/\d+\.\d+/]
#=> "151.13"
i = g.to_f
#=> 151.13
arr << i
#=> [151.13]
arr
#=> [151.13]
JSON.parse(json_str)['items'].first['item_group'].first['section'].
each_with_object([]) do |g, arr|
arr << g['values'].first['display'][/\d+\.\d+/].to_f
end
#=> [151.13, 170.39]
require 'jq'
require 'jq/extend'
json_content = {
"items": [
{
"name": "table",
"item_group": [
{
"code": "code1",
"section": [
{
"unit": "centimeter",
"values": [
{
"display": "151.13 centimeter"
}
]
},
{
"unit": "centimeter (qualifier value)",
"values": [
{
"display": "170.39 centimeter"
}
]
}
],
"total": 2
}
],
"more_results": false,
"total": 1
}
]
}
jq_filter = ' .items | .[].item_group |.[].section| . [ ] .values | . [ ] .display'
final_array = json_content.jq(jq_filter)
# => final_array = ["151.13 centimeter", "170.39 centimeter"]