【问题标题】:Select a value from an array of hashes从哈希数组中选择一个值
【发布时间】:2015-08-05 10:51:49
【问题描述】:

来自哈希数组:

response = [
  {"label"=>"cat", "name"=>"kitty", "id"=>189955},
  {"label" => "dog", "name"=>"rex", "id" => 550081}
]

有没有办法写出类似的东西:

response.name.kitty

检索包含此值的哈希:

{"label"=>"cat", "name"=>"kitty", "id"=>189955}

【问题讨论】:

  • 有一种方法可以在 Ruby 中通过重写 method_missing 来动态地做任何事情。你的想法的目的是什么?
  • @dcorking:把同事搞糊涂了,也许吧? :)
  • 我的想法是,通过元编程使用 Strut 或 OpenStrut 在 ruby​​ 中可能有一种方法,它允许您从散列数组或深度嵌套的散列数组中动态选择一个值。也许我需要将其转换为 json,然后使用实例方法。抱歉,如果我没有清楚地解释我想要达到的目标
  • 请解释为什么 Amit 的答案不能满足您的需要。这可能有助于我们更好地理解您的问题。
  • Amit 的回答很棒,我一直在寻找的可能是 ruby​​ 有一种方法可以动态选择散列数组中的值。

标签: arrays ruby hash


【解决方案1】:

你可以这样做 -

response.select{|x| x["name"] == "kitty"}.first

【讨论】:

  • 这会为您提供以下结果:{"label"=>"cat", "name"=>"kitty", "id"=>189955}。示例:repl.it/BATV
  • 或者只使用检测/查找而不是选择+优先
  • @SergioTulentsev ......是的,我们可以这样做 >>> response.find{|x| x["name"] == "kitty"}
【解决方案2】:

使用过程

response = [{"label"=>"cat", "name"=>"kitty", "id"=>189955},
            {"label" => "dog", "name"=>"rex", "id" => 550081}]
finder = Proc.new {|k, v| response.find {|r| r[k] == v} }

然后

finder.call('name', 'rex')
# => {"label"=>"dog", "name"=>"rex", "id"=>550081} 
finder.call('label', 'cat')
# => {"label"=>"cat", "name"=>"kitty", "id"=>189955}

【讨论】:

  • 我喜欢这种方式Proc 1+ for this
  • finder['name', 'rex']
  • 通过一些调整,proc 可以接受哈希,即finder['label' => 'cat', 'name' => 'sam']
【解决方案3】:

如果需要,您还可以像这样传递多个条件:

response = [
  {"label"=>"cat", "name"=>"kitty", "id"=>189955},
  {"label"=>"cat", "name"=>"kitty", "id"=>189956},
  {"label"=>"cat", "name"=>"kitty", "id"=>189957},
  {"label"=>"cat", "name"=>"meow", "id"=>189957},
  {"label" => "dog", "name"=>"rex", "id" => 550081},
  {"label" => "dog", "name"=>"tommy", "id" => 550082},
  {"label" => "dog", "name"=>"rex", "id" => 550083}
]

> response.select{|h| h["label"] == "cat" && h["name"] == "kitty" && h["id"] == 189955}
=> [{"label"=>"cat", "name"=>"kitty", "id"=>189955}] # returns array of selected hashes

> response.find{|h| h["label"] == "cat" && h["name"] == "kitty" && h["id"] == 189955}
=> {"label"=>"cat", "name"=>"kitty", "id"=>189955} # returns first match element

【讨论】:

  • select + first 找到所有元素并丢弃除第一个之外的所有元素。请改用find,它会在第一场比赛后停止。
【解决方案4】:

如果您使用的是 Rails - 只需使用 .pluck

array_of_hashes = [
  { name: "Kate", city: "Minsk", country: "Belarus", id: 1 },
  { name: "Mike", city: "New York", country: "USA", id: 2 },
  { name: "Aleh", city: "Warsaw", country: "Poland", id: 3},
]


>> array_of_hashes.pluck(:name)
>>
>> [ "Kate", "Mike", "Aleh" ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 2015-03-06
    • 2015-07-08
    • 1970-01-01
    • 2014-07-25
    • 2017-01-16
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多