ruby - 通过哈希映射返回 nil?

发布于 2025-01-11 06:34:36 字数 621 浏览 0 评论 0 原文

{"key_a" => "value_a", "key_b" => "value_b", "key_c" => { "key_c_a" => nil, "key_c_b" => nil, "key_c_c" => "value_c_c"}, "key_d" => nil, "key_e" => nil }

我如何映射哈希,以便得到结果为“key_c_a”、“key_c_b”、“key_d”和key_e”?

我不断得到我的答案作为一个空数组,这是模块中使用的方法主班

    def self.get_null_keys(container)
      container.map do |key, value|
        if value.is_a?(Array)
          value.map { |field| render_null_fields(field) }
        elsif value.is_a?(Hash)
          render_null_fields(value)
        elsif value.nil?
          key
        end
      end
    end
{"key_a" => "value_a", "key_b" => "value_b", "key_c" => { "key_c_a" => nil, "key_c_b" => nil, "key_c_c" => "value_c_c"}, "key_d" => nil, "key_e" => nil }

how do i map the hash such that i get the result as "key_c_a", "key_c_b", "key_d" and key_e"?

i keep getting my answer as an empty array and here is the method in the module that is used in the main class

    def self.get_null_keys(container)
      container.map do |key, value|
        if value.is_a?(Array)
          value.map { |field| render_null_fields(field) }
        elsif value.is_a?(Hash)
          render_null_fields(value)
        elsif value.nil?
          key
        end
      end
    end

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

请远离我 2025-01-18 06:34:36

简单的递归方法:

hash = {"key_a" => "value_a", "key_b" => "value_b", "key_c" => { "key_c_a" => nil, "key_c_b" => nil, "key_c_c" => "value_c_c"}, "key_d" => nil, "key_e" => nil }

def get_null_values(hash, array = [])
  hash.each do |key, value|
    array << key if value.nil?
    get_null_values(value, array) if value.is_a?(Hash)
  end
  array
end

get_null_values(hash) # ["key_c_a", "key_c_b", "key_d", "key_e"]

Naive recursive way to do it:

hash = {"key_a" => "value_a", "key_b" => "value_b", "key_c" => { "key_c_a" => nil, "key_c_b" => nil, "key_c_c" => "value_c_c"}, "key_d" => nil, "key_e" => nil }

def get_null_values(hash, array = [])
  hash.each do |key, value|
    array << key if value.nil?
    get_null_values(value, array) if value.is_a?(Hash)
  end
  array
end

get_null_values(hash) # ["key_c_a", "key_c_b", "key_d", "key_e"]
马蹄踏│碎落叶 2025-01-18 06:34:36

递归地执行:

h={"key_a" => "value_a", "key_b" => "value_b", "key_c" => { "key_c_a" => nil, "key_c_b" => nil, "key_c_c" => "value_c_c"}, "key_d" => nil, "key_e" => nil }

def find_nils(x, memo=[]) 
    x.inject({}){ |m, (k, v)|
        v = find_nils(v, memo) if v.is_a? Hash  # arbitrarily recursive
        memo << k if v.nil? 
    }
    memo
end

除了使用 inject 作为骨架,您还可以使用 each

def find_nils(x, memo=[]) 
    x.each{ |k, v|
        v = find_nils(v, memo) if v.is_a? Hash  # arbitrarily recursive
        memo << k if v.nil? 
    }
    memo
end

或者:

p find_nils(h)
["key_c_a", "key_c_b", "key_d", "key_e"]

Do it recursively:

h={"key_a" => "value_a", "key_b" => "value_b", "key_c" => { "key_c_a" => nil, "key_c_b" => nil, "key_c_c" => "value_c_c"}, "key_d" => nil, "key_e" => nil }

def find_nils(x, memo=[]) 
    x.inject({}){ |m, (k, v)|
        v = find_nils(v, memo) if v.is_a? Hash  # arbitrarily recursive
        memo << k if v.nil? 
    }
    memo
end

Instead of inject as a skeleton you can also use each:

def find_nils(x, memo=[]) 
    x.each{ |k, v|
        v = find_nils(v, memo) if v.is_a? Hash  # arbitrarily recursive
        memo << k if v.nil? 
    }
    memo
end

Either:

p find_nils(h)
["key_c_a", "key_c_b", "key_d", "key_e"]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文