2016-10-12 6 views
-3

私はRubyでトップの統計を計算するプロセスを書いています。私はオブジェクト配列をフィルタリングする方法についての質問があります。ruby​​オブジェクトの配列のフィルタ

以下のオブジェクト配列が与えられた場合、これはブローカレッジ、avg_price、およびavg_ratingによってソートされます。後者は私に、各証券会社のトップブローカーを与える

[{: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}] 

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

は、任意のマップは、収集し、私はこの配列を軽減することができますなどの機能が選択されています。私はこれが各ブロックを使用して実行可能であり、単に新しい証券会社の最初のインスタンスを書き出すことを知っています。私はちょうどルビーがこれのための機能を内蔵しているのだろうかと思っています。

+1

これらが有効なオブジェクト –

+0

ではありません私は、説明のポイントとしてそれらを使用しています。それらはルビーオブジェクトであり、jsonオブジェクトではありません。 – user2547177

+1

にはコードサンプルが用意されているので、他のユーザーもこのサンプルを使用できます。そうしないと、私たちがあなたを助けることはできません。 http://stackoverflow.com/help/mcveを参照してください。 –

答えて

0

すでにをavg_rating でトップ評価を計算していますし、単にに等しいをavg_rating を有するものを戻したいと仮定次のように、あなたはEnumerable#select方法を適用することができます。data.select {|c| c[:avg_rating] == 1 }

をあなたができない場合avg_ratingに依存し、ブローカーごとにアカウントごとにavg_priceのトップを決定したい場合は、データセットを変換して分析を実行できます。

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

のいずれかは、所望の最終的な配列につながる:

[{: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

前にも述べたように、私はトップの価値がどのようになるか分かりません。私はちょうどイラストとしてそれを置いた。 – user2547177

+0

あなたの質問は「オブジェクト配列をフィルタリングする方法」でした。私のソリューションは、あなたが提供した唯一の量的価値であるavg_priceとavg_ratingの両方でそうする方法を示しています。 – Cam

+0

値はサンプルです。彼らは保証ではありません。 – user2547177

関連する問題