我有这样的嵌套哈希:
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一起使用?
答案 0 :(得分:1)
这里的懒惰方法是使用条件导航运算符,换句话说:
nil
如果v
为nil
,则返回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
是一种将多个结果数组组合成单个最终结果的方法。