2

次の形式のデータがあります

"stats": {
    "team": [],
    "outcome": [],
    "rank": []
}

上記の構造から 2 つ以上の結果の組み合わせが存在するかどうかを判断し、何かを出力する必要があります。

したがって、アイデアは次のとおりです。

(if stats.team.present? && if stats.outcome.present) || (if stats.outcome.present? && if stats.rank.present) || (if stats.team.present? && if stats.rank.present)

より良い方法は、チーム、結果、ランクのカウントが 0 より大きい場合にインクリメントされるカウンターを追加するメソッドを作成することです。

次に、カウンターが 2 より大きいかどうかを確認します。例:

def my_count
  count = 0

  count += 1 if stats.team.count > 0
  count += 1 if stats.outcome.count > 0
  count += 1 if stats.rank.count > 0

  if count > 1
    return true
  end
end

これらは唯一の2つのオプションですか、それともよりクリーンな方法はありますか?

4

5 に答える 5

2

これらは唯一の2つのオプションですか、それともよりクリーンな方法はありますか?

よりクリーンな方法がたくさんありますが、最良の方法は ActiveSupport の一部である を使用しますmany?

many?は基本的に に似any?ていますが、「1 つ以上」が条件を満たしているかどうかを尋ねる代わりに、2 つ以上のかどうかを尋ねます。これは、質問の最も意味的に正しい実装です。

stats = { team: [], outcome: [], rank: [] }}

stats.many? { |k,v| v.present? } # false

stats = { team: [1], outcome: [1], rank: [] }}

stats.many? { |k,v| v.present? } # true

stats.valuesこれをさらにSymbol#to_proc短くするために少し賢くすることができますが、私はその必要性を知りません:

stats.values.many?(&:present?)
于 2013-08-20T20:13:11.497 に答える
1

配列に変換する必要はありません:

data = {stats: { team: [], outcome: [], rank: [] }}

if data[:stats].reject{|k,v| v.empty?}.size > 1
于 2013-08-20T19:34:51.293 に答える
0

あなたは次のようにすることができます

data = {"stats" => { "team" => [], "outcome" => [1], "rank" => [] }}
if data["stats"].values.count([]) > 1
    #code
end
于 2013-08-20T19:29:33.473 に答える
-1

まず、ハッシュかオブジェクトか?ハッシュを考えてみます。

あなたの質問によると: ある種の MapReduce の方が見栄えが良いかもしれません:

["team", "outcome", "rank"].map{|key| stats[key].present? }.count(true) > 1
于 2013-08-20T19:35:00.843 に答える