[
{
"name": "John Doe",
"location": {
"name": "New York, New York",
"id": 12746342329
},
"hometown": {
"name": "Brooklyn, New York",
"id": 43453644
}
},
{
"name": "Jane Doe",
"location": {
"name": "Miami, Florida",
"id": 12746342329
},
"hometown": {
"name": "Queens, New York",
"id": 12746329
}
}
]
鉴于这段 JSON,我如何能够遍历并提取所有“hometown”和“location”键并查看哪些人具有 New York 的值?
我的问题是我可以 Array.each 通过这些项目,但我不知道如何使用我的标准(“纽约”)遍历位置和家乡。
最佳答案
people.select {|person|
person.any? {|k, v|
%w[location hometown].include?(k) && /New York/ =~ v['name']
}}
这基本上说明了以下内容:选择数组中满足以下条件的所有条目。条件是:对于任何键值对,键是 'hometown'
或 'location'
和 name
属于该键的值的属性匹配正则表达式 /New York/
?
但是,您的对象模型似乎非常需要重构。事实上,主要问题是您的对象模型甚至不是对象模型,它是散列和数组模型。
这就是我所说的适当对象模型的意思:
class Person
attr_reader :name, :location, :hometown
def initialize(name, location=nil, hometown=nil)
@name, @location, @hometown = name, location, hometown
end
def cities
return @location, @hometown
end
end
class City
attr_reader :id, :name
def initialize(id, name)
@id, @name = id, name
end
def =~(other)
name =~ other
end
end
nyc = City.new(12746342329, 'New York, New York')
brooklyn = City.new(43453644, 'Brooklyn, New York')
miami = City.new(12746342329, 'Miami, Florida')
queens = City.new(12746329, 'Queens, New York')
john = Person.new('John Doe', nyc, brooklyn)
jane = Person.new('Jane Doe', miami, queens)
people = [john, jane]
如果你有这样一个合适的对象模型,你的代码就会变得更清晰,因为你不必梳理散列和数组的嵌套迷宫的 bults 的坚果,你有漂亮的小对象,你可以简单地问一些问题:
people.select {|person| person.cities.any? {|city| city =~ /New York/ }}
你几乎可以像英语一样阅读它:从数组中选择所有城市匹配正则表达式 /New York/
的人。
如果我们进一步改进对象模型,它会变得更好:
class Person
def lived_in?(pattern)
cities.any? {|city| city =~ pattern }
end
end
people.select {|person| person.lived_in?(/New York/) }
这基本上是说“从人群中,选择曾经居住在纽约的人”。这比“从人们中选择所有键值对的第一个元素是字符串 'hometown'
或字符串 'location'
和第二个元素要好得多键值对的元素匹配正则表达式 /New York/
”。
关于ruby - 比较 Ruby 数组中的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3344651/