【问题标题】:Filter JSON array by value with Ruby使用 Ruby 按值过滤 JSON 数组
【发布时间】:2014-10-29 17:40:24
【问题描述】:

我有一个类似这样的 JSON 数组。

[
 {"name":"Idaho","state":{"id":1,"name":"A"}},
 {"name":"Wyoming","state":{"id":1,"name":"A"}},
 {"name":"Montana","state":{"id":2,"name":"B"}},
 {"name":"South Dakota","state":{"id":1,"name":"B"}}
]

如何使用 Ruby 仅显示 A 的值?

我不认为 sort_by 会是答案,因为我下面的内容只是按字母顺序对它们进行排序。我想完全排除 B 的所有结果。

.sort_by { |a| [a.state.name] }

在 .rb 文件中执行此操作的最有效方法是什么?


我解决了我自己的问题。我就是这样实现了我想要的。

.select { |a| a.state.name == "A" }

【问题讨论】:

  • a.state.name 是你在 JavaScript 中的做法,但在 Ruby 中这是 a['state']['name']
  • Enumerable#select 方法也值得一读。
  • 或者,str.scan(/[A-Z][a-zA-Z\s]+(?=.+:\"A\".+?$)/) => ["Idaho", "Wyoming"]

标签: ruby arrays json


【解决方案1】:
require 'json'

json = <<'JSON_STRING'
[
 {"name":"Idaho","state":{"id":1,"name":"A"}},
 {"name":"Wyoming","state":{"id":1,"name":"A"}},
 {"name":"Montana","state":{"id":2,"name":"B"}},
 {"name":"South Dakota","state":{"id":1,"name":"B"}}
]
JSON_STRING

data = JSON.parse json

data.map(&:values).select { |state, values| values["name"] == ?A }
#=> [["Idaho", {"id"=>1, "name"=>"A"}], ["Wyoming", {"id"=>1, "name"=>"A"}]]

data.map(&:values).select { |state, values| values["name"] == ?A }.map(&:first)
#=> ["Idaho", "Wyoming"]

【讨论】:

    【解决方案2】:
    require 'json'
    
    arr = JSON.parse <<END_OF_JSON
    [
     {"name":"Idaho","state":{"id":1,"name":"A"}},
     {"name":"Wyoming","state":{"id":1,"name":"A"}},
     {"name":"Montana","state":{"id":2,"name":"B"}},
     {"name":"South Dakota","state":{"id":1,"name":"B"}}
    ]
    END_OF_JSON
    
    results = []
    
    arr.each do |hash|
      results << hash["name"] if hash["state"]["name"] == "A"
    end
    
    p results
    
    --output:--
    ["Idaho", "Wyoming"]
    

    【讨论】:

      【解决方案3】:

      不正确:

      .select { |a| a.state.name == "A" }
      

      正确方法:

      .select { |a| a['state']['name'] == 'A' }
      

      【讨论】:

        猜你喜欢
        • 2021-08-26
        • 1970-01-01
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-18
        相关资源
        最近更新 更多