迭代嵌套哈希以获取字符串数组

时间:2019-08-27 16:25:08

标签: ruby

我有这样的嵌套哈希:

s = Struct.new :topic_version

s_blank = s.new
s_bar = s.new "bar"
s_foo = s.new "foo"

h = {
  :aa=>{:services=>[nil, s_blank, s_bar]},
  :ab=>{:services=>[s_blank, nil, s_bar, s_bar]},
  :ac=>{:services=>[nil, s_foo, s_blank]}
} 

我想获得一个字符串值数组,例如。 ["bar", baz"]

我的尝试是:

@topic_version_collection = []
h.each do |key, value| 
  value[:services].each do |v|
    @topic_version_collection << v.topic_version
  end
end

如果数组中没有任何nil值,它将起作用。

但是如何使它与nils一起使用?

1 个答案:

答案 0 :(得分:1)

这里的懒惰方法是使用条件导航运算符,换句话说:

nil

如果vnil,则返回x = [ ] y.each do |z| x << z.a end 的地方。

不过,这只是表面。当您看到模式时:

x = y.map(&:a)

您真正想要的是:

map

values在其中使用1:1 映射将一个数组中的值转换为另一个数组中的值。

要在此处构建解决方案,请先从哈希中去除:services,然后在嵌套的哈希中拉出topic_version键,然后在所有非{{ 1}}个条目。由于这些可以返回nil,因此请在结尾加上nil除去nil

换句话说:

compact

现在,如果您希望它们唯一,请在末尾添加h.values.map do |v| v[:services] end.flat_map do |v| v.compact.map(&:topic_version) end.compact

.uniq是一种将多个结果数组组合成单个最终结果的方法。