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 一起工作呢?
解决方案
这里懒惰的方式是使用条件导航操作符,或者换句话说:
v&.topic_version
nil
if v
is返回的位置nil
。
不过,这只是表面问题。当你看到模式时:
x = [ ]
y.each do |z|
x << z.a
end
你真正想要的是:
x = y.map(&:a)
Where有助于使用 1:1映射将map
一个数组中的值转换为另一个数组中的值。
要在这里建立一个解决方案,首先values
从哈希中去除 ,然后在嵌套的哈希中提取:services
键,然后调用topic_version
所有非nil
条目。由于那些可以返回nil
,最后去掉nil
。compact
换句话说:
h.values.map do |v|
v[:services]
end.flat_map do |v|
v.compact.map(&:topic_version)
end.compact
现在,如果您希望它们独一无二,请.uniq
在最后添加。
这flat_map
是一种将多个结果数组组合成单个最终结果的方法。
推荐阅读
- bash - 为什么从方法中调用方法会避免在新行中打印?
- java - 我在创建 Spring Boot 项目 pom.xml 时首先遇到错误
- angular - 获取 mat-checkbox 的选中值 - Angular Material
- javascript - 为什么我的两个单独的脚本不能在我的 html 文档中串行运行?
- java - 检查 base64 文本是否是有效的 RSA 公钥 (4096)
- java - 我无法远程连接到我的 dropwizard 应用程序
- php - 如何从mysql pdo生成wav文件到dumpfile
- tensorflow - ValueError:获取参数
不能解释为张量 - php - 在 laravel/PHP 中具有相同命名空间的 2 个类
- java - 当我第二次尝试运行 Hello Agent 时,会发生此错误