Ruby on rails Ruby数组构造

Ruby 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": [ {

我有下面的json

{
    "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"]