2017-08-09 8 views
1

私はハッシュを受け入れるメソッドを持っています。私は、ハッシュをチェックして、最初に見つかった一致するキーの値を返すキー配列(優先順位順)を持っていますが、これはblank?ではありません。これまでのところ私は以下のことを持っていますが、私はこのメソッドを大いに利用しているので、もっと効率的な方法があるのだろうかと思います。 「フー」ハッシュキー/値が存在する場合、与えられたキーの配列でハッシュ値を返すより効率的な方法はありますか?

+1

あなたはキーと値のペアが必要だと書いてありますが、あなたのコードは値を返すだけです。あなたは本当に欲しいのですか? – sawa

+0

わかりやすくするために編集しました - 順序付けられたキーのリストで見つかった最初のキーの値が必要です。ハッシュにはキーの一部または全部が含まれていることがありますが、ハッシュにキーを持たせることもありますが、値ではありません(真実の値ではない)。 –

+1

コードの行に沿って、 'break my_hash [key]'を実行することもできます。 – sawa

答えて

5

はあなたの方法は、効率の観点から最善におそらく近いです:私はresultがあることを期待する

{ 
    id: 10, 
    title: "", 
    name: "Foo", 
    slug: "foo" 
} 

result = [:title, :name, :identifier, :slug].each do |key| 
      if my_hash[key].present? 
       return my_hash[key] 
       break 
      end 
      end 

だから、次のハッシュを与えられました。しかし、あなたは、その後、それは効率を維持し、よりエレガントになりたい場合:

my_hash[%i[title name identifier slug].find{|key| my_hash[key].present?}] 
0

あなたは、次の操作を行うことができます

whitelisted_keys = [:title, :name, :identifier, :slug] 
filtered_hash = your_hash.slice(*whitelisted_keys) # will only get pair matching your whitelisted_keys 

# return all `.present?` key/values pairs: 
filtered_hash.select{ |k,v| v.present? } 

# return an array of the first key/value pair present: 
filtered_hash.find{ |k,v| v.present? } # append .last to get the value 

澤はコメントで指摘したように、これが最も効率的ではありません

+0

ニース!私は 'スライス 'の使い方を理解しようとしていましたが、私が見逃していたのはあなたの' whitelisted_keys'でした。どういうわけか: 'your_hash [your_hash.slice(* whitelisted_keys).keys.first]'? – jvillian

+0

これは、最初にホワイトリストに登録されたキーの値を返すだけです(存在しないかもしれません) – MrYoshiji

+2

これはエレガントかもしれませんが、OPよりも効率が悪いです。中間ハッシュを作成しています。また、Railsのメソッド 'slice'を呼び出すと、コードの効率が悪くなります。 – sawa

関連する問題