【问题标题】:How to remove hash keys which hash value is blank?如何删除哈希值为空白的哈希键?
【发布时间】:2013-10-09 12:44:36
【问题描述】:

我正在使用 Ruby on Rails 3.2.13,我想删除对应的哈希值为空白的哈希键。也就是说,如果我有以下哈希

{ :a => 0, :b => 1, :c => true, :d => "", :e => "   ", :f => nil }

那么生成的哈希应该是(注意:0true 不被视为空白)

{ :a => 0, :b => 1, :c => true }

我怎样才能做到这一点?

【问题讨论】:

  • 你想保留:g => []h => {}吗?

标签: ruby-on-rails ruby ruby-on-rails-3 hash key-value


【解决方案1】:

如果使用 Rails 你可以试试

hash.delete_if { |key, value| value.blank? }

或者如果只是 Ruby

hash.delete_if { |key, value| value.to_s.strip == '' }

【讨论】:

  • value.to_s.strip.empty? 读起来比 == '' 好一点,IMO。此外,您不需要 Rails 拥有blank?,只需 ActiveSupport。
  • 如果值是一个空的散列怎么办?或者进一步嵌套的哈希是空的?
【解决方案2】:

有多种方法可以完成这项常见任务

拒绝

这是我最常用于清理哈希的一种,因为它简短、干净且足够灵活,可以支持任何条件并且不会改变原始对象。这是一个good article,关于 ruby​​ 中不变性的好处。

hash.reject {|_,v| v.blank?}

注意:上例中的下划线用于表示我们要解包传递给 proc 的元组,但我们没有使用第一个值(键)。

拒绝!

但是,如果你想改变原始对象:

hash.reject! {|_,v| v.blank?}

选择

相反,您使用 select,它只会返回在评估时返回 true 的值

hash.select {|_,v| v.present? }

选择!

...以及变异版本

hash.select {|_,v| v.present? }

紧凑

最后,当您需要删除具有nil 值的键时...

hash.compact

紧凑!

您现在已经掌握了模式,但这是修改原始哈希的版本!

hash.compact!

【讨论】:

    【解决方案3】:

    关于 techvineet 的解决方案,当 value == [] 时,请注意以下几点。

    [].blank?               => true 
    [].to_s.strip == ''     => false 
    [].to_s.strip.empty?    => false
    

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 2016-02-06
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2023-03-17
      • 1970-01-01
      • 2021-05-25
      相关资源
      最近更新 更多