如何在Ruby中获取多维哈希表中的键?

5

使用普通哈希函数,可以通过此方法获取键:

hash.keys

如何获取一个类似于以下多维哈希表的第二个维度的键:

{"<id>"=>{"first_name"=>"test", "last_name"=>"test_l", "username"=>"test_user", 
"title"=>"Sales Manager", "office"=>"test", "email"=>"test@test.com"}}

<id>是每个项目的唯一标识。

因此,我想要上面列出的键:first_name, last_name, username, title, office and email

4个回答

4
你可以这样做:

你可以这样做:

hash["<id>"].keys

hash["<id>"].keys 更加正确。原帖中展示的键是字面字符串。 - the Tin Man

3
以下代码将获取第二层哈希表中使用的所有键。我使用了uniq以避免重复。
hash.collect { |k, v| v.keys }.flatten.uniq

hash.values.collect(&:keys).flatten.uniq,这避免了使用块。 - Mark Reed
1
如果你正在使用 mapcollect,使用 {} 而不是 doend 是惯用的。当将方法链接到块的末尾时,特别适用于此。链接到 end 尤其丑陋。 - the Tin Man

3
我假设你指的是基本哈希表中会有几个唯一的“id”键,它们指向包含“first_name”、“last_name”等键的嵌套哈希表。如果是这种情况:
hash.values.map(&:keys)

该函数将返回一个包含每个嵌套哈希表中键的数组。

另一方面,如果您只有一个键值对(就像您的示例中一样),您可以执行以下操作:

hash.values.first.keys

这将返回一个扁平的数组,其中的键对应于孤立嵌套哈希表中的键。


2
假设您有一个哈希表,其中有一个未知键和一个值:一个哈希表。
h = {"<id>"=>{"first_name"=>"test", "last_name"=>"test_l", "username"=>"test_user", 
"title"=>"Sales Manager", "office"=>"test", "email"=>"test@test.com"}}

p h[h.keys.first].keys
#=> ["first_name", "last_name", "username", "title", "office", "email"]

但每次我看到像这样的结构时,我都想知道为什么它不是一个结构体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接