ruby - 比较 Ruby 数组中的多个值

标签 ruby arrays json

[
    {
        "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/

相关文章:

ruby-on-rails - Rails 4:安装elasticsearch和searchkick时出错

json - 如何在DRF中序列化一个对象的多个图像(如url中)?

使用jq在cli上解析Json

c - 如何使 "if"条件代表 C 中的所有结构项

java - JsonFormat.printer().print() 是如何工作的?

javascript - 在 Rails 中使用 bootstrap-sass,Bootstrap/Javascript 不工作

ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们

ruby - Rspec 模拟错误 : wrong number of arguments

java - 如何制作不同长度的对象数组?

c - C 中不同类型的字符串声明