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

这些是仅有的两个选项还是有更清洁的方法?

4

5 回答 5

2

这些是仅有的两个选项还是有更清洁的方法?

大量更简洁的方法,但最好的方法将使用many?ActiveSupport 的一部分。

many?本质上类似于any?,但不是询问“一个或多个”是否满足条件,而是询问两个或多个. 到目前为止,这是您问题的语义上最正确的实现:

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.valuesSymbol#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 回答
-1

您可以尝试 map/reduce 并可以在此处阅读更多信息

在 map/reduce 之后,您可以检查输出以查看是否有任何组合

于 2013-08-20T19:42:24.180 回答