使用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密钥并仍然得到正确的结果?
答案 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中,“删除键值对并从其键等于键的哈希值返回值。”