2016-10-12 3 views
-3

Ich schreibe einen Prozess in Ruby, um Top-Statistiken zu berechnen. Ich habe eine Frage, wie man ein Objekt-Array filtert.Filter auf einem Array von Ruby-Objekten

Angesichts der folgenden Objekt-Array, Dies ist nach Brokerage, avg_price und avg_rating sortiert.

data = [ 
{name: "something1", brokerage: "some broker1", avg_price: 100, avg_rating: 1}, 
{name: "something2", brokerage: "some broker1", avg_price: 90, avg_rating: 2}, 
{name: "something3", brokerage: "some broker1", avg_price: 80, avg_rating: 3}, 
{name: "something4", brokerage: "some broker2", avg_price: 100, avg_rating: 1}, 
{name: "something5", brokerage: "some broker2", avg_price: 90, avg_rating: 2}, 
{name: "something6", brokerage: "some broker2", avg_price: 80, avg_rating: 3}, 
{name: "something7", brokerage: "some broker3", avg_price: 100, avg_rating: 1}, 
{name: "something8", brokerage: "some broker3", avg_price: 90, avg_rating: 2}, 
{name: "something9", brokerage: "some broker3", avg_price: 80, avg_rating: 3}, 
{name: "something10", brokerage: "some broker4", avg_price: 100, avg_rating: 1}] 

Gibt es eine Karte, zu sammeln, usw. Funktion auswählen, die mir erlauben, dieses Array zu reduzieren: in jedem Broker

[{:name=>"something1", :brokerage=>"some broker1", :avg_price=>100, :avg_rating=>1}, 
{:name=>"something4", :brokerage=>"some broker2", :avg_price=>100, :avg_rating=>1}, 
{:name=>"something7", :brokerage=>"some broker3", :avg_price=>100, :avg_rating=>1}, 
{:name=>"something10", :brokerage=>"some broker4", :avg_price=>100, :avg_rating=>1}] 

Letzteres gibt mir die Top-Broker. Ich weiß, dass dies machbar ist, indem man jeden einzelnen Block benutzt und einfach die erste Instanz eines neuen Brokerage schreibt. Ich frage mich nur, ob Ruby eine eingebaute Funktion dafür hat.

+1

diese sind nicht gültige Objekte –

+0

Ich verwende sie nur als ein Punkt der Abbildung. Sie sind Rubin-Objekte, keine Json-Objekte. – user2547177

+1

on SO stellen Sie ein Codebeispiel bereit, damit andere Benutzer damit arbeiten können. Sonst können wir Ihnen nicht helfen. Siehe http://stackoverflow.com/help/mcve –

Antwort

0

Sie bereits die Bestnoten in avg_rating berechnet der Annahme und einfach wünschen, die mit einem avg_rating gleich zurückzukehren, können Sie die Enumerable#select Methode anwenden wie folgt: data.select {|c| c[:avg_rating] == 1 }

Wenn Sie nicht können verlassen Sie sich auf avg_rating und möchten die oberen avg_price für jedes Konto pro Makler ermitteln, könnten Sie Ihren Datensatz umwandeln und einige Analysen durchführen ...

# Collect hash of all brokers and prepare an array of names 
brokers = Hash[data.map{|c| c[:brokerage] }.uniq.zip.map{|c| c.push []}] 

# Fill our brokers hash with each account they are responsible for 
data.each_with_object(brokers) do |account,brokers| 
    brokers[account[:brokerage]].push account 
end 

# Determine the top account per broker using our brokers Hash 
brokers.map {|key,arr| arr.max_by{|x| x[:avg_price] }} 

von denen jeder in die gewünschte endgültige Anordnung führen würde:

[{:name=>"something1", :brokerage=>"some broker1", :avg_price=>100, :avg_rating=>1}, 
{:name=>"something4", :brokerage=>"some broker2", :avg_price=>100, :avg_rating=>1}, 
{:name=>"something7", :brokerage=>"some broker3", :avg_price=>100, :avg_rating=>1}, 
{:name=>"something10", :brokerage=>"some broker4", :avg_price=>100, :avg_rating=>1}] 
+0

Wie ich schon sagte, ich weiß nicht, was die Spitzenwerte sein werden. Ich gebe das nur zur Veranschaulichung an. – user2547177

+0

Ihre Frage lautete: "Wie filtere ich ein Objekt-Array?" Meine Lösung zeigt, wie Sie dies sowohl bei avg_price als auch bei avg_rating tun können. Dies waren die einzigen quantitativen Werte, die Sie angegeben haben. – Cam

+0

Die Werte waren Proben. Sie sind keine Garantien. – user2547177