2016-09-06 5 views
1

Ich habe einige JSON-Daten, die eine Datum Uhrzeit Zeichenfolge und insgesamt speichert. z.B.Gruppe JSON als neue Objekte basierend auf Daten

[{ 
    "Date": "2012-04-01 12:00:00", 
    "Total": "14" 
}, { 
    "Date": "2012-04-02 06:00:00", 
    "Total": "3" 
}, { 
    "Date": "2012-04-02 14:00:00", 
    "Total": "12" 
}, { 
    "Date": "2012-04-02 16:00:00", 
    "Total": "5" 
}, { 
    "Date": "2012-04-02 17:00:00", 
    "Total": "7" 
}, { 
    "Date": "2012-04-03 06:00:00", 
    "Total": "9" 
}, { 
    "Date": "2012-04-03 14:00:00", 
    "Total": "2" 
}, { 
    "Date": "2012-04-04 06:00:00", 
    "Total": "1" 
}, { 
    "Date": "2012-04-04 14:00:00", 
    "Total": "10" 
}, { 
    "Date": "2012-04-04 19:00:00", 
    "Total": "8" 
}, { 
    "Date": "2012-04-04 21:00:00", 
    "Total": "4" 
}] 

Was ich tun möchte, ist neue JSON-Objekte für Daten, die das gleiche Jahr, Monat und Tag ist.

zum Beispiel also eine ganze Reihe von Daten formatiert in sein könnte:

TAG:

[{ 
    "Date": "2012-04-01" 
    "Total": "3" 
},{ 
    "Date": "2012-04-02" 
    "Total": "4" 
},{ 
    "Date": "2012-04-03" 
    "Total": "6" 
}] 

MONAT:

[{ 
    "Date": "2012-04" 
    "Total": "36" 
},{ 
    "Date": "2012-05" 
    "Total": "11" 
},{ 
    "Date": "2012-06" 
    "Total": "23" 
},{ 
    "Date": "2012-07" 
    "Total": "17" 
}] 

JAHR:

[{ 
    "Date": "2012" 
    "Total": "91" 
},{ 
    "Date": "2013" 
    "Total": "102" 
},{ 
    "Date": "2014" 
    "Total": "78" 
}] 

Wie konnte Ich tue das ist Rails? Wenn ich ein Beispiel dafür bekommen könnte, wie ich einen von ihnen machen könnte, dann könnte ich das als Grundlage für die anderen nutzen!

So in der Steuerung habe ich:

def get_count_day 
    render json: data.to_json 
end 

def get_count_month 
    render json: data.to_json 
end 

def get_count_year 
    render json: data.to_json 
end 

Antwort

1

Hey Sie auf diese Weise für Tag versuchen

given_json.group_by{|b| b["Date"].to_date.strftime("%Y-%d-%m")}.collect{|key,value| {"Date" =>key , "Total" => value.sum{|d| d["Total"].to_i}}} 

Für Monat

given_json.group_by{|b| b["Date"].to_date.strftime("%Y-%m")}.collect{|key,value| {"Date" =>key , "Total" => value.sum{|d| d["Total"].to_i}}} 

für Jahr

given_json.group_by{|b| b["Date"].to_date.strftime("%Y")}.collect{|key,value| {"Date" =>key , "Total" => value.sum{|d| d["Total"].to_i}}} 
0

Hier ist ein Beispiel, sie von Tag gruppiert abzurufen:

grouped_json = Hash.new(0) 
your_json_array.each do |array_element| 
    date = Date.parse(array_element['Date']).strftime('%Y-%m-%d') 
    grouped_json[date] += array_element['Total'] 
end 
grouped_json.map {|k,v| {'Date' => k, 'Total' => v} } 

Monat?

grouped_json = Hash.new(0) 
your_json_array.each do |array_element| 
    date = Date.parse(array_element['Date']).strftime('%Y-%m') 
    grouped_json[date] += array_element['Total'] 
end 
grouped_json.map {|k,v| {'Date' => k, 'Total' => v} } 

nach Jahr?

grouped_json = Hash.new(0) 
your_json_array.each do |array_element| 
    date = Date.parse(array_element['Date']).strftime('%Y') 
    grouped_json[date] += array_element['Total'] 
end 
grouped_json.map {|k,v| {'Date' => k, 'Total' => v} } 
2
count_by_day = 
    json.group_by{ |record| record[:Date].to_date.strftime } 
     .map { |k, v| { Date: k, Total: v.map { |y| y[:Total].to_i }.sum.to_s } } 

#=> [{:Date=>"2012-04-01", :Total=>"14"}, {:Date=>"2012-04-02", :Total=>"27"}, {:Date=>"2012-04-03", :Total=>"11"}, {:Date=>"2012-04-04", :Total=>"23"}] 

count_by_month = 
    json.group_by{ |record| record[:Date].to_date.strftime('%Y-%m') } 
     .map { |k, v| { Date: k, Total: v.map { |y| y[:Total].to_i }.sum.to_s } } 

#=> [{:Date=>"2012-04", :Total=>"75"}] 

count_by_year = 
    json.group_by{ |record| record[:Date].to_date.strftime('%Y') } 
     .map { |k, v| { Date: k, Total: v.map { |y| y[:Total].to_i }.sum.to_s } } 

#=> [{:Date=>"2012", :Total=>"75"}] 
+0

Ich erhalte eine Fehlermeldung 'nicht definierte Methode group_by ' – Cameron

+0

'Json' hier ist das Array der Hashes, die Sie in der Frage –

+0

in Ihrem Fall geschrieben haben, ich denke, es wird' data.group_by .... 'wenn' data' ist '{ " Date ":" 2012- 04-01 12:00:00 ", " Gesamt ":" 14 " }, { " Datum ":" 2012-04-02 06:00:00 ", " Gesamt ":" 3 " } .....] ' –

Verwandte Themen