2014-09-04 3 views
4

У меня есть массив JSON, который выглядит примерно так.Фильтр JSON массив по значению с Ruby

[ 
{"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" } 
+0

'a.state.name' как вы могли бы сделать это в JavaScript, но в Ruby, это' а [ 'состояние'] [ 'имя'] '. – tadman

+0

Также стоит прочитать метод ['Enumerable # select'] (http://ruby-doc.org/core-2.1.2/Enumerable.html#method-i-select). – tadman

+0

В качестве альтернативы, 'str.scan (/ [AZ] [a-zA-Z \ s] + (? =. +: \" A \ ". +? $) /) => [" Айдахо "," Вайоминг " ] '. –

ответ

3
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"] 
Смежные вопросы