我有一个哈希数组,如下所示:
sample = {:a=>1, :b=>2, :c=>{:c1=>abc, :c2=>xyz}, :d=>3}
我想要的输出是:
1|2|abc|xyz|3
但是如果我使用命令:sample.values.join("|")
我的输出显示如下:
1|2|c1abcc2xyz|3
请帮我解决这个问题。提前谢谢。
答案 0 :(得分:4)
要处理任意深度,您需要使用递归,如下所示:
def nested_values(object)
object.values.reduce([]) do |array, value|
array + (value.is_a?(Hash) ? nested_values(value) : [value])
end
end
sample = {:a=>1, :b=>2, :c=>{:c1=>:abc, :c2=>:xyz}, :d=>3}
p nested_values(sample).join("|")
输出:
"1|2|abc|xyz|3"
答案 1 :(得分:4)
sample.values.flat_map { |x| x.is_a?(Hash) ? x.values : [x] }.join("|")
#=> "1|2|abc|xyz|3"
答案 2 :(得分:0)
请检查这个非常棘手的简单代码。它将返回你的预期
sample = {:a=>1, :b=>2, :c=>{:c1=>abc, :c2=>xyz}, :d=>3}
b= []
sample.values.each do |a|
if a.class != Hash
b << a
else
c =a.values
b << c
end
end
b.join('|')
=> "1|2|abc|xyz|3"
答案 3 :(得分:0)
sample = {:a=>1, :b=>2, :c=>{:c1=>:abc, :c2=>:xyz}, :d=>3}
sample.values.map{|i| next i.values if i.instance_of? Hash ; i}.flatten.join('|')
#=> "1|2|abc|xyz|3"