如何有选择地迭代此哈希?

时间:2015-03-26 16:15:55

标签: ruby

{
  "menu": {
    "header": "menu",
    "items": [
      {"id": 27},
      {"id": 0, "label": "Label 0"},
      null,
      {"id": 93},
      {"id": 85},
      {"id": 54},
      null,
      {"id": 46, "label": "Label 46"}
    ]
  }
}

以上是我试图迭代的JSON。基本上,如果该哈希值还有"id"密钥,我想确定密钥"label"的值。

所以上面的内容也会返回046

我被困在这里:

require 'json'

line = '{"menu": {"header": "menu", "items": [{"id": 27}, {"id": 0, "label": "Label 0"}, null, {"id": 93}, {"id": 85}, {"id": 54}, null, {"id": 46, "label": "Label 46"}]}}'
my_parse = JSON.parse(line)
items = my_parse['menu']['items'].compact.select { |item| item['label'] }

puts items.inject

3 个答案:

答案 0 :(得分:2)

使用Array#select来识别同时包含" id"和"标签"然后Array#map只选择" ID"。

hash = JSON.parse(your_json_string)
hash['menu']['items'].select { |h| h && h['id'] && h['label'] }.map {|h| h['id']}
# => [0, 46]

更清理的版本可能看起来像这样

def ids_with_label(json_str)
  hash = JSON.parse(json_str)
  items = hash['menu']['items']
  items_with_label = items.select { |h| h && h.include?('id') && h.include?('label') }
  ids = items_with_label.map { |h| h['id'] }
  ids
end

ids_with_label(your_json_string) # => [0, 46]

答案 1 :(得分:0)

我不知道这是不是你想要的:

items = my_parse['menu']['items'].compact.select { |item| item.has_key?('label') }.map{ |item| item['id'] }

答案 2 :(得分:0)

无需创建临时数组:

my_parse['menu']['items'].each_with_object([]) { |o,a|
  a << o['id'] if o && o.key?('id') && o.key?('label') }
  #=> [0, 46]