Найти все ключи во вложенном ha sh из соответствующего значения (например, ha shie deeplocate), сохраняя при этом иерархию предков - PullRequest
2 голосов
/ 23 апреля 2020

Скажем, у меня есть глубоко вложенный ха sh, такой как

data = {
  key1: 'foo baz',
  arbitary_key2: {
    arbitrary_key3: {
      unknown_key4: "bar baz",
      unknown_key5: "foo qux"
    },
  key6: "bar qux"
}}

Есть ли какой-нибудь способ найти совпадение и вернуть только ключи с сохраненными их предками?

> data.deep_select { |key, value| /bar/i.match?(value) }
# => {
  arbitary_key2: {
    arbitrary_key3: {
      unknown_key4: "bar baz"
    }
  },
  key6: "bar qux"
}

Ха shie :: DeepLocate приближает меня так близко, но возвращает только листья найденных результатов, и я теряю родительские ключи по пути. Как я могу сохранить иерархию?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Следующий рекурсивный метод вернет нужный массив.

def filter(h,re)
  h.each_with_object({}) do |(k,v),g|
    if v.is_a?(Hash)
      f = filter(v,re)
      g[k] = f unless f.empty?
    else
      g[k] = v if v.match?(re)
    end
  end
end

data = {
  key1: 'foo baz',
  arbitary_key2: {
    arbitrary_key3: {
      unknown_key4: "bar baz",
      unknown_key5: "foo qux"
    },
    key6: "bar qux"
  }
}

filter(data, /bar/)
  #=> { :arbitary_key2=>{
  #       :arbitrary_key3=>{ :unknown_key4=>"bar baz" },
  #       :key6=>"bar qux"
  #     }
  #   }
0 голосов
/ 23 апреля 2020

Используйте https://github.com/evolve75/RubyTree, чтобы найти детей на дереве и получить его предков.

...