【问题标题】:Is there an elegant way in Ruby to filter a hash of arrays of hashses?Ruby 中是否有一种优雅的方式来过滤散列数组的散列?
【发布时间】:2020-10-23 11:57:13
【问题描述】:

假设我有这种类型的数据结构:

{
  "foo": [{state: on}, {state: off}, {state: on}],
  "bar": [{state: off}, {state: off}, {state: on}],
  "baz": [{state: on}, {state: on}, {state: on}]
}

如何以优雅的方式过滤嵌套的哈希数组,以便找回:

{
  "foo": [{state: on}, {state: on}],
  "bar": [{state: on}],
  "baz": [{state: on}, {state: on}, {state: on}]
}

【问题讨论】:

    标签: ruby filter ruby-hash


    【解决方案1】:
    a={
        "foo": [{state: "on"}, {state: "off"}, {state: "on"}],
        "bar": [{state: "off"}, {state: "off"}, {state: "on"}],
        "baz": [{state: "on"}, {state: "on"}, {state: "on"}]
    }
    

    代码

    p a.transform_values{|arr| arr.select{|h|h[:state].eql?'on'}}
    

    结果

    {:foo=>[{:state=>"on"}, {:state=>"on"}], :bar=>[{:state=>"on"}], :baz=>[{:state=>"on"}, {:state=>"on"}, {:state=>"on"}]}
    

    【讨论】:

      【解决方案2】:

      给定:

      data = {
        "foo": [{state: :on}, {state: :off}, {state: :on}],
        "bar": [{state: :off}, {state: :off}, {state: :on}],
        "baz": [{state: :on}, {state: :on}, {state: :on}]
      }
      

      使用#transform_values 迭代和替换哈希值,使用#select 过滤数组中的元素:

      data.transform_values do |value|
        value.select { |hash| hash[:state] == :on  }
      end
      

      【讨论】:

      • 啊哈transform_keys!我还没有看到这个。太棒了!
      • 糟糕,应该是 transform_values
      猜你喜欢
      • 2011-09-19
      • 2021-06-09
      • 1970-01-01
      • 2013-09-10
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2011-07-24
      相关资源
      最近更新 更多