2016-07-02 12 views
0

Ich bin neu in Ruby. Ich habe erfolgreich "title" mit puts in diesem Code unten gedruckt, das zieht aus den Daten von .Wie konvertiere ich ein Float in eine Zeichenfolge, die in einem Hash verschachtelt ist, und setzt dann?

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

Allerdings, wenn ich versuche, für die "price" das gleiche zu tun, es ist nicht zu STDOUT Druck. Ich weiß nicht, ob das Problem darin besteht, dass es sich um ein Float handelt oder weil es sich in einem anderen Array befindet. Mein Code ist wie folgt:

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

Jeder Einblick würde sehr geschätzt werden.


Daten

{ 
    "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" 
     } 
    }] 
    }] 
} 

Antwort

0

In ["inventory"].each do |key|, key ist nur ein normaler string, nicht die inventory erwartet.

inventory scheint wie json, müssen Sie zuerst JSON.parse(a string)/JSON.load(or file) verwenden, um es in Ruby zu JSON-Objekt zu konvertieren, dann können Sie each, um das Objekt zu durchqueren.

4

Erstens, die richtige Einrückung (beachten Sie unbedingt, was ich unten verwendet habe) wird Ihnen helfen, die Struktur des Objekts zu verstehen.

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" } 
      } 
      ] 
     } 
     ] 
    } 

können wir die Preise wie folgt drucken:

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

die durch die Berechnungen gehen lassen.

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"} 
    #     } 
    #     ] 
    #  } 
    # ] 

Wie man sieht, ist ein Array a ein Element enthält, einen Hash. Um diesen Hash zu erhalten, wählen wir das erste Element von 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"} 
    #     } 
    #     ] 
    # } 

Als nächstes wollen wir den Wert des Schlüssels :purchases in der Hash-b.

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" } 
    # } 
    # ] 

Da jedes der drei Elemente der c ist ein Hash mit Schlüssel :price, können wir die Werte, die Schlüssel durch Durchschleifen des Hashes drucken:

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

beachten:

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

Dies zeigt Ihnen, dass die doppelten Anführungszeichen unnötig sind, aber das ist nur, wenn das Symbol ein einzelnes Wort enthält.Bedenken Sie:

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

Hier müssen wir die Zitate:

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

Ich nahm an, es JSON war. Hoffe, das OP kommt zurück und tötet die Spannung. Wie auch immer, großartige umfassende Erklärung! – 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 

ANTWORT

Hier sind zwei Möglichkeiten, um price Zugang:

1) Adresse genaue Hash Verwenden Sie verschachtelten Wert zuzugreifen:

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) Schleife durch untergeordneten Knoten:

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

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

# ProductOne 
# 15.99 
# 18.99