【问题标题】:Ruby/Rails return hash element if hash value is a string如果哈希值是字符串,Ruby/Rails 返回哈希元素
【发布时间】:2021-11-19 04:07:33
【问题描述】:

在我的 Rails 6 和 Ruby 2.7 应用程序中,我试图只返回这些哈希值是字符串的哈希元素。问题是这个散列中有其他散列(所以它是散列的散列)。如下:

hash = {
  language: 'EN',
  details: {
    resultRanges: {
      book: {
        title: 'Dunder Mifflin',
        available: true,
        rank: -1.0,
        label: 'gray',
      },
    },
  },
}

从那个哈希我应该得到类似的东西:

{
  language: 'EN',
  details: {
    resultRanges: {
      book: {
        title: 'Dunder Mifflin',
        label: 'gray',
      },
    },
  },
}

我不知道该怎么做。如果我使用hash.keys,我会得到[:language, :details],所以我不能使用hash.select { |k, v| v.is_a?(String) }之类的东西,因为它只会给我第一个哈希键-{:language=>"EN"}

【问题讨论】:

  • 您能澄清一下您的问题吗?在你的问题的标题中,你要求散列 keys 是字符串,而在你的问题正文中,你要求散列 values 是字符串。这两个是哪个?
  • @JörgWMittag 哦,是的,很好!这是关于附加示例中的值

标签: ruby-on-rails ruby hash


【解决方案1】:

你需要的是一个递归,即一个函数,调用自己:

def filter_hash(hash)
  hash.each_with_object({}) do |(key, value), acc|
    acc[key] = value if value.is_a?(String)
    acc[key] = filter_hash(value) if value.is_a?(Hash)
  end
end

这个函数检查你的哈希值是否为String,然后保存它,如果它是Hash,它用嵌套的哈希调用自己

【讨论】:

  • 太好了!只是想知道,我应该怎么做才能将 { language: 'EN', details: { resultRanges: { book: { title: 'Dunder Mifflin', label: 'gray' }}}} 中的过滤哈希结构替换为 { language: 'EN', details_resultRanges_book_title: 'Dunder Mifflin', details_resultRanges_book_label: 'gray' }
  • this 之类的东西可以解决问题
【解决方案2】:

您正在寻找递归函数。

def recursively_delete(hash)
  hash.each do |k, v|
    if v.is_a?(Hash)
      recursively_delete(v)
    elsif !v.is_a?(String)
      hash.delete(k)
    end
  end
end

recursively_delete(hash)
p hash

=> {:language=>"EN", :details=> {:resultRanges=>{:book=>{:title=>"Dunder Mifflin", :label=>"gray"}}}}

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2018-10-17
    • 2017-10-02
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    相关资源
    最近更新 更多