2014-09-24 64 views
-2
filters = { 
    "start_year" => "2009", 
    "end_year" => "2011", 
    "theme" => "", 
    "discipline" => "" 
} 

filters.length4,但我想2获取哈希的长度,不空值

+1

你的哈希看起来很奇怪 – Stefan 2014-09-24 13:24:24

+1

它既不是有效的Ruby对象也不是有效的JSON对象。 – sawa 2014-09-24 13:25:37

+0

什么是“过滤器”? – sawa 2014-09-24 13:32:03

回答

5

使用count

filters = {"start_year"=>"2009", "end_year"=>"2011", "theme"=>"", "discipline"=>""} 

filters.count { |k, v| v.present? } 
#=> 2 
+0

'filters'从哪里来? – sawa 2014-09-24 13:24:45

+1

@sawa加我的假设 – Stefan 2014-09-24 13:26:16

+0

谢谢!这确实是一个红宝石散列;) – Paul 2014-09-24 14:39:57

0

您可以使用

filters.reject { |k, v| v.empty? }.length # => 2 
(谁拥有不仅一个关键,也是一个价值的)
+0

'filters'从哪里来? – sawa 2014-09-24 13:26:32

+0

从问题:)。 “'filters.length'会是4,...”。 – 2014-09-24 13:27:51

+0

我想知道这个问题中的描述是否合理。 – sawa 2014-09-24 13:29:32

0

解析json字符串。使用Enumerable#select

require 'json' 

json_string = <<EOS 
{ 
    "filters": { 
    "start_year": "2009", 
    "end_year": "2011", 
    "theme": "", 
    "discipline": "" 
    } 
} 
EOS 

h = JSON.parse(json_string) 

和过滤值:

h['filters'].values.select { |x| x != "" } 
# => ["2009", "2011"] 
h['filters'].values.select { |x| x != "" }.size 
# => 2 
0
filters.values.reject(&:empty?).length 

如果空值保存为nil,而不是''你可以使用:

filters.values.compact.length