从不同嵌套的哈希中提取特定键
Extract specific keys from variedly nested hash
我正在尝试将提供的哈希中的不同 "Name" 值连接成一个字符串。所以输出应该是一个包含所有 "Name" 值的数组或字符串。
对我来说困难在于 嵌套级别在两个和四个 parents 之间变化 parents。
我试过用两种方法解决:
- 递归地遍历散列并在每个级别上将值附加到数组。终于把数组吐出来了
- 展平哈希,然后从该数组中挑选
不幸的是,none 相关问题中给出的答案似乎也有效。我敢肯定这很简单,但我似乎无法弄清楚。非常感谢
my_hash = { "BreadCrumbs" => {
"Id" => 375,
"Name" => "Willingen",
"Parent" => {
"Id" => 52272,
"Name" => "Wintersport-Arena Sauerland",
"Parent" => {
"Id" => 8,
"Name" => "Germany"
}
}
}
}
▶ hash = { "BreadCrumbs" => {
▷ "Id" => 375,
▷ "Name" => "Willingen",
▷ "Parent" => {
▷ "Id" => 52272,
▷ "Name" => "Wintersport-Arena Sauerland",
▷ "Parent" => {
▷ "Id" => 8,
▷ "Name" => "Germany"
▷ }
▷ }
▷ }}
▶ def concat hash
▷ [hash['Name'], hash['Parent'] ? concat(hash['Parent']) : nil]
▷ end
▶ (concat hash['BreadCrumbs']).flatten.compact
#⇒ ["Willingen", "Wintersport-Arena Sauerland", "Germany"]
我不会在每次迭代时都展平,因此结果仍然包含层次结构:
▶ concat hash['BreadCrumbs']
#⇒ ["Willingen", ["Wintersport-Arena Sauerland", ["Germany", nil]]]
请求的字符串作为结果:
▶ (concat hash['BreadCrumbs']).flatten.compact.join ', '
#⇒ "Willingen, Wintersport-Arena Sauerland, Germany"
对于任意数量的级别,不使用递归:
def pull_names(hash)
h = hash
names = []
loop do
names << h["Name"]
return names unless h.key?("Parent")
h = h["Parent"]
end
end
假设:
hash = { "BreadCrumbs" => {
"Name" => "Willingen",
"Parent" => {
"Id" => 52272,
"Name" => "Wintersport-Arena Sauerland",
"Parent" => {
"Id" => 8,
"Name" => "Germany",
"Parent" => {
"Id" => 1,
"Name" => "Bora Bora"
}
}
}
}
}
然后:
arr = pull_names hash["BreadCrumbs"]
#=> ["Willingen", "Wintersport-Arena Sauerland", "Germany", "Bora Bora"]
arr.join(' ')
#=> "Willingen Wintersport-Arena Sauerland Germany Bora Bora"
我正在尝试将提供的哈希中的不同 "Name" 值连接成一个字符串。所以输出应该是一个包含所有 "Name" 值的数组或字符串。
对我来说困难在于 嵌套级别在两个和四个 parents 之间变化 parents。
我试过用两种方法解决:
- 递归地遍历散列并在每个级别上将值附加到数组。终于把数组吐出来了
- 展平哈希,然后从该数组中挑选
不幸的是,none 相关问题中给出的答案似乎也有效。我敢肯定这很简单,但我似乎无法弄清楚。非常感谢
my_hash = { "BreadCrumbs" => {
"Id" => 375,
"Name" => "Willingen",
"Parent" => {
"Id" => 52272,
"Name" => "Wintersport-Arena Sauerland",
"Parent" => {
"Id" => 8,
"Name" => "Germany"
}
}
}
}
▶ hash = { "BreadCrumbs" => {
▷ "Id" => 375,
▷ "Name" => "Willingen",
▷ "Parent" => {
▷ "Id" => 52272,
▷ "Name" => "Wintersport-Arena Sauerland",
▷ "Parent" => {
▷ "Id" => 8,
▷ "Name" => "Germany"
▷ }
▷ }
▷ }}
▶ def concat hash
▷ [hash['Name'], hash['Parent'] ? concat(hash['Parent']) : nil]
▷ end
▶ (concat hash['BreadCrumbs']).flatten.compact
#⇒ ["Willingen", "Wintersport-Arena Sauerland", "Germany"]
我不会在每次迭代时都展平,因此结果仍然包含层次结构:
▶ concat hash['BreadCrumbs']
#⇒ ["Willingen", ["Wintersport-Arena Sauerland", ["Germany", nil]]]
请求的字符串作为结果:
▶ (concat hash['BreadCrumbs']).flatten.compact.join ', '
#⇒ "Willingen, Wintersport-Arena Sauerland, Germany"
对于任意数量的级别,不使用递归:
def pull_names(hash)
h = hash
names = []
loop do
names << h["Name"]
return names unless h.key?("Parent")
h = h["Parent"]
end
end
假设:
hash = { "BreadCrumbs" => {
"Name" => "Willingen",
"Parent" => {
"Id" => 52272,
"Name" => "Wintersport-Arena Sauerland",
"Parent" => {
"Id" => 8,
"Name" => "Germany",
"Parent" => {
"Id" => 1,
"Name" => "Bora Bora"
}
}
}
}
}
然后:
arr = pull_names hash["BreadCrumbs"]
#=> ["Willingen", "Wintersport-Arena Sauerland", "Germany", "Bora Bora"]
arr.join(' ')
#=> "Willingen Wintersport-Arena Sauerland Germany Bora Bora"