2016-07-02 7 views
0

私はルビーが初めてです。私は"inventory"のデータから引っ張っているこのコードでputsを使用して"title"を正常に印刷しました。しかし浮動小数点数をハッシュの中にネストされた文字列に変換して配置するにはどうすればよいですか?

hash["inventory"].each do |key| 
    puts key["title"] 
end 

、私はそれがSTDOUTに印刷していないです"price"のために同じことをしよう。フロートであるか、別の配列になっているので問題があるかどうかはわかりません。私のコードは次の通りです:

puts "#{key["price"]}" 

いずれの洞察も高く評価されます。 ["inventory"].each do |key|


データ

{ 
    "inventory": [{ 
    "title": "ProductOne", 
    "description": "This is a description for product one", 
    "brand": "ProductBrandName", 
    "stock": 30, 
    "full-price": "24.99", 
    "purchases": [{ 
     "channel": "online", 
     "date": "2011-12-31T23:59:59+00:00", 
     "price": 15.99, 
     "shipping": 0.0, 
     "currency": "USD", 
     "user": { 
     "name": "John Brown", 
     "state": "KY" 
     } 
    }, { 
     "channel": "online", 
     "date": "2012-12-31T23:59:59+00:00", 
     "price": 18.99, 
     "shipping": 7.50, 
     "currency": "USD", 
     "user": { 
     "name": "Jack Black", 
     "state": "NY" 
     } 
    }] 
    }] 
} 

答えて

0

keyあなたが期待inventorystring普通ではありません。

はjsonのようですが、最初にJSON.parse(a string)/JSON.load(or file)を使用してrubyのjsonオブジェクトに変換する必要があります。次にeachを使用してオブジェクトを走査できます。

4

最初に、適切なインデント(必然的に私が以下で使用したことに注意してください)は、オブジェクトの構造を理解するのに役立ちます。

h = { inventory: [ 
     { 
      title: "ProductOne", 
      description: "This is a description for product one", 
      brand: "ProductBrandName", 
      stock: 30, 
      "full-price": "24.99", 
      purchases: [ 
      { 
       channel: "online", 
       date: "2011-12-31T23:59:59+00:00", 
       price: 15.99, 
       shipping: 0.0, 
       currency: "USD", 
       user: { name: "John Brown", state: "KY" } 
      }, 
      { 
       channel: "online", 
       date: "2012-12-31T23:59:59+00:00", 
       price: 18.99, 
       shipping: 7.50, 
       currency: "USD", 
       user: { name: "Jack Black", state: "NY" } 
      } 
      ] 
     } 
     ] 
    } 

次のように我々は価格を印刷することができます。

h[:inventory].first[:purchases].each { |g| puts g[:price] } 
15.99 
18.99 

はのは、計算見ていきましょう。

a = h[:inventory] 
    #=> [ 
    #  { :title=>"ProductOne", :description=>"This is a description for product one", 
    #  :brand=>"ProductBrandName", :stock=>30, :"full-price"=>"24.99", 
    #  :purchases=>[{ :channel=>"online", :date=>"2011-12-31T23:59:59+00:00", 
    #      :price=>15.99, :shipping=>0.0, :currency=>"USD", 
    #      :user=>{:name=>"John Brown", :state=>"KY"} 
    #     }, 
    #     { :channel=>"online", :date=>"2012-12-31T23:59:59+00:00", 
    #      :price=>18.99, :shipping=>7.5, :currency=>"USD", 
    #      :user=>{:name=>"Jack Black", :state=>"NY"} 
    #     } 
    #     ] 
    #  } 
    # ] 

ご覧のとおり、aは、1つの要素、ハッシュを含む配列です。そのハッシュを得るために、aという最初の要素を選択します。

b = a.first 
    #=> { :title=>"ProductOne", :description=>"This is a description for product one", 
    #  :brand=>"ProductBrandName", :stock=>30, :"full-price"=>"24.99", 
    #  :purchases=>[{ :channel=>"online", :date=>"2011-12-31T23:59:59+00:00", 
    #     :price=>15.99, :shipping=>0.0, :currency=>"USD", 
    #     :user=>{:name=>"John Brown", :state=>"KY"} 
    #     }, 
    #     { :channel=>"online", :date=>"2012-12-31T23:59:59+00:00", 
    #     :price=>18.99, :shipping=>7.5, :currency=>"USD", 
    #     :user=>{:name=>"Jack Black", :state=>"NY"} 
    #     } 
    #     ] 
    # } 

次は、私たちは、ハッシュbにおけるキー:purchasesの値を求めています。

c = b[:purchases] 
    #=> [ 
    # { :channel=>"online", :date=>"2011-12-31T23:59:59+00:00", 
    #  :price=>15.99, :shipping=>0.0, :currency=>"USD", 
    #  :user=>{ :name=>"John Brown", :state=>"KY" } 
    # }, 
    # { :channel=>"online", :date=>"2012-12-31T23:59:59+00:00", 
    #  :price=>18.99, :shipping=>7.5, :currency=>"USD", 
    #  :user=>{:name=>"Jack Black", :state=>"NY" } 
    # } 
    # ] 

cの三つの要素のそれぞれは、キー:price付きハッシュであるので、我々はハッシュをループすることによって、そのキーの値を出力することができるが:

c.each { |g| puts g[:price] } 
15.99 
18.99 

なお:

{ "a": 1 } 
    #=> {:a=>1} 
{ a: 1 } 
    #=> {:a=>1} 

これは二重引用符が不要であることを示していますが、記号が単一の単語で構成される場合にのみ表示されます。この考えてみましょう:

{ full price: "24.99" } 
    #=>SyntaxError:... 
{ full-price: "24.99" } 
    #=>SyntaxError:... 

をここに引用符が必要です

{ "full price": "24.99" } 
    #=> {:"full price"=>"24.99"} 
{ "full-price": "24.99" } 
    #=> {:"full-price"=>"24.99"} 
+0

私はそれがJSONだったと仮定。 OPが戻ってサスペンスを殺すことを願っています。いずれにせよ、偉大な包括的な説明! – SoAwesomeMan

0

DATA

require 'json' 

hash = JSON.parse <<EOS 
{ 
    "inventory": [{ 
    "title": "ProductOne", 
    "description": "This is a description for product one", 
    "brand": "ProductBrandName", 
    "stock": 30, 
    "full-price": "24.99", 
    "purchases": [{ 
     "channel": "online", 
     "date": "2011-12-31T23:59:59+00:00", 
     "price": 15.99, 
     "shipping": 0.0, 
     "currency": "USD", 
     "user": { 
     "name": "John Brown", 
     "state": "KY" 
     } 
    }, { 
     "channel": "online", 
     "date": "2012-12-31T23:59:59+00:00", 
     "price": 18.99, 
     "shipping": 7.50, 
     "currency": "USD", 
     "user": { 
     "name": "Jack Black", 
     "state": "NY" 
     } 
    }] 
    }] 
} 
EOS 

ANSWER

子ノードを

hash['inventory'].each do |k| 
    puts k['title'] 
    puts k['purchases'][0]['price'] 
    puts k['purchases'][1]['price'] 
end 

# ProductOne 
# 15.99 
# 18.99 

2)ループ:ここ

priceにアクセスするには2つの方法があります:

1)ネストされた値にアクセスするには、正確なハッシュアドレスを使用し

hash['inventory'].each do |k| 
    puts k['title'] 

    k['purchases'].each do |x| 
    puts x['price'] 
    end 
end 

# ProductOne 
# 15.99 
# 18.99 
関連する問題