如何从散列数组中滤除哈希值?

时间:2016-12-27 08:46:25

标签: arrays ruby select filter

我的params看起来像这样:

params = [{:limit=>5}, {:skip=>0}, {:asc=>""}, {:desc=>""}]

我想删除值为0的哈希元素或空字符串。我试过了:

params.reject { |h| h.values !== 0 }

但是这给了我一个语法错误

也尝试过:

params.select { |h| h.values != 0 || h.values != "" }

但这没有给我什么。我做错了什么?

4 个答案:

答案 0 :(得分:3)

你有一个哈希数组,所以你必须对每个哈希进行操作。

params.reject { |hash| hash.any? { |_, v| [0, ''].include?(v) }}
#=> [{:limit=>5}]

答案 1 :(得分:2)

您可以只合并所有哈希值来获取一个大哈希值,而不是只有一对|key,value|的哈希数组。

删除不需要的值变得更加容易,并且提取信息也变得更加容易:

params = [{ limit: 5 }, { skip: 0 }, { asc: '' }, { desc: '' }]

hash = params.inject(&:merge).reject{|_, value| value == 0 || value == '' }
# => {:limit=>5}

hash[:limit]
# => 5

使用哈希数组,你必须写:

(h = array_of_hashes.find{|h| h.keys.include?(:limit)} ) && h[:limit]
#=> 5

答案 2 :(得分:0)

我找到了两种方法:

filtered = params.reject { |hash| hash.values.any? { |v| v.to_i == 0 } }

filtered = params.select { |hash| hash.values.none? { |val| val == '' || val == 0 } }

答案 3 :(得分:0)

使用带有include的拒绝也可以解决这个问题。

 params.reject { |key| key.values.include?(0) || key.values.include?("") }