ruby使用map返回一个子元素数组

时间:2014-01-30 14:30:21

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我有以下结构:

"countries": [
  {
    "states" :[
      {
        "name" :"Texas",
        "id": "a1"
      },
      {
        "name" :"Nebraska",
        "id": "a1"
      }
    ]
  },
  {

    "states" :[
      {
        "name" :"New York",
        "id": "a1",
      },
      {
        "name" :"Florida",
        "id": "a1"
      }
    ]
  }
]

我想从上面返回所有状态的数组。 这是我试过的:

 countries.map { |country| country.states.map { |state| state.name } }

但它只返回前两个州“德州”和内布拉斯加州。

有人可以告诉我这里做错了吗?

2 个答案:

答案 0 :(得分:0)

你的结构不对,所以更正了:

countries = [
      {
        "states" => [
          {
            "name" => "Texas",
            "id"=> "a1"
          },
          {
            "name"=> "Nebraska",
            "id"=> "a1"
          }
        ]
      },
      {
        "states" => [
          {
            "name"=> "New York",
            "id"=> "a1",
          },
          {
            "name" =>"Florida",
            "id"=> "a1"
          }
        ]
      }
    ]

出于某些奇怪的原因,Ruby并没有接受“:”字符串。像这样(不起作用):

countries = [
      {
        "states": [
          {
            "name": "Texas",
            "id": "a1"
          },
          {
            "name": "Nebraska",
            "id": "a1"
          }
        ]
      },
      {
        "states": [
          {
            "name": "New York",
            "id": "a1",
          },
          {
            "name" :"Florida",
            "id": "a1"
          }
        ]
      }
    ]

为此,你可以这样做:

countries.map{ |c| c["states"].map{|s| s["name"]}}.flatten
#=> ["Texas", "Nebraska", "New York", "Florida"]

或者,如果你得到重复值,那么:

countries.map{ |c| c["states"].map{|s| s["name"]}}.flatten.uniq
#=> ["Texas", "Nebraska", "New York", "Florida"]

我希望这会有所帮助。

答案 1 :(得分:0)

去找苏里亚的答案,这是同样的解决方案。只是想表明我是怎么写的:

countries.map{|x|x['states']}
         .flatten
         .map{|x|x['name']}