bugfix> arrays > 投稿

私はJSONのAPIからデータを取得してきましたが、現在は初歩的な問題につまずいています

データは、GoogleやFacebookなどの企業にあり、次のように配列またはハッシュにあります。

[
  {"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>GOOG, "primary_role"=>"company"}},
  {"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>FB, "primary_role"=>"company"}}
]

以下は、試してみたい2つの操作です。

  1. 各会社について、名前、ID、および銘柄記号(「Google-1-GOOG」および「Facebook-2-FB」)を印刷します
  2. GoogleとFacebookから「プライマリロール」キー/値を削除する
  3. GoogleとFacebookに新しい「業界」キー/値を割り当てます

何か案は?

Rubyの初心者ですが、配列とハッシュの一部の関数/メソッド(未定義のメソッドなど)で問題が発生しています。これは配列OFハッシュのようです

ありがとうございました!

回答 1 件
  • Rubyには、配列、ハッシュ、および両方のネストされた混合物を理解するのに役立つツールがいくつか用意されています。

    データが次のようになっていると仮定します( GOOG の周りに引用符を追加しました  および FB ):

    data = [
      {"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>"GOOG", "primary_role"=>"company"}},
      {"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>"FB", "primary_role"=>"company"}}
    ]
    
    

    each を使用して配列を反復処理できます 、例えば:

    data.each do |result|
       puts result["id"]
    end
    
    

    ハッシュを掘り下げて結果を出力するには、いくつかの方法があります。

    data.each do |result|
      # method 1
      puts result["properties"]["name"]
      # method 2  
      puts result.dig("properties", "name")
    end
    
    

    方法#1は hash[key] を使用します  構文、および最初のハッシュ値が別のハッシュであるため、目的の結果を得るために連鎖できます。このアプローチの欠点は、不足している properties がある場合  キーを押すと、エラーが発生します。

    方法#2は dig を使用します 、ネストされたキーを引数として(順番に)受け入れます。ネストされたハッシュを掘り下げて値を引き出しますが、ステップが欠落している場合は nil を返します 、外部ソースからのデータを処理している場合は少し安全です

    ハッシュから要素を削除する

    2番目の質問はもう少し複雑です。次の2つのオプションがあります。

    primary_role を削除する  ネストされたハッシュのキー、または

    primary_role を除くすべてのデータを含む新しいオブジェクトを作成します  キー。

    私は通常後者を選び、不変性と不変のデータ構造を読むことをお勧めします。

    ただし、[1]を達成するには、インプレースの delete を実行できます。  キーの:

    data.each do |company| 
      company["properties"].delete("primary_role")
    end
    
    
    ハッシュに要素を追加する

    単に hash[key] = value で新しいハッシュ値を割り当てます ので、次のようなもので業界を設定できます。

    data.each do |company| 
      company["properties"]["industry"] = "Advertising/Privacy Invasion"
    end
    
    

    次のようになります:

    [
      {
        "id"=>"1", 
        "properties"=>{
          "name"=>"Google", 
          "stock_symbol"=>"GOOG", 
          "industry"=>"Advertising/Privacy Invasion"
        }
      },
      {
        "id"=>"2", 
        "properties"=>{
          "name"=>"Facebook", 
          "stock_symbol"=>"FB", 
          "industry"=>"Advertising/Privacy Invasion"
        }
      }
    ]
    
    

あなたの答え