如何从哈希中删除nil密钥?

时间:2017-05-31 15:16:28

标签: arrays ruby hash null key

使用Ruby 2.4,我想计算一个元素的出现次数并将它们存储在一个哈希中。但是,我不希望在哈希中包含任何nil键。所以我试过

my_hash = int_data_col.each_with_object(Hash.new(0)) { |i, h| h[i]+=1 }.delete(nil)

但是返回“1”。如果我不使用“delete(nil)”,它会返回一个哈希,但是哈希中会包含一个nil键(假设“int_data_col”数组中存在nil)。如何从哈希中删除nil密钥并仍然得到正确的结果?

3 个答案:

答案 0 :(得分:2)

使用Array#compact删除计数前的所有nil值。

my_hash = int_data_col.compact.each_with_object(Hash.new(0)) { |i, h| h[i]+=1 }

答案 1 :(得分:2)

在Ruby 2.4中,有一种非常易读的方法:

arr.compact.group_by(&:itself).transform_values(&:size)

答案 2 :(得分:0)

如果要在对数组进行散列之前清理数组,那么

int_data_col.compact! 
int_data_col.each_with_object(Hash.new(0)) {|i, h| h[i]+=1 }

如果你想简单地创建哈希,忽略nil,而不打扰原始数组,那么@ sagarpandya82

建议如下
int_data_col.compact.each_with_object(Hash.new(0)) { |i, h| h[i]+=1 }

当您指定.delete(nil)时,我认为您希望它在删除nil键的情况下返回哈希值。但它做的是删除nil键并返回nil键的计数值(1)。从Hash Class doc中,“删除键值对并从其键等于键的哈希值返回值。”