Ruby on rails 如何在管道分隔的情况下打印哈希值

Ruby on rails 如何在管道分隔的情况下打印哈希值,ruby-on-rails,ruby,rubygems,Ruby On Rails,Ruby,Rubygems,我有一个哈希数组,如下所示: sample = {:a=>1, :b=>2, :c=>{:c1=>abc, :c2=>xyz}, :d=>3} 我想要的结果是: 1|2|abc|xyz|3 但是如果我使用命令:sample.values.join(“|”) 我的输出显示如下: 1|2|c1abcc2xyz|3 请帮我解答这个问题。提前感谢。要处理任意深度,需要使用递归,如下所示: def nested_values(object) object.va

我有一个哈希数组,如下所示:

sample = {:a=>1, :b=>2, :c=>{:c1=>abc, :c2=>xyz}, :d=>3}
我想要的结果是:

1|2|abc|xyz|3
但是如果我使用命令:
sample.values.join(“|”)

我的输出显示如下:

1|2|c1abcc2xyz|3

请帮我解答这个问题。提前感谢。

要处理任意深度,需要使用递归,如下所示:

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"

请检查这个相当复杂的简单代码。它将返回你所期望的

 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" 
sample={:a=>1,:b=>2,:c=>abc,:c2=>xyz},:d=>3}
b=[]
sample.values.each do | a|
如果是a.class!=搞砸

b和我的代码一样,但很简单。因此,你得到了分数,但我没有:(@RubyLovely:我没有看到你的,但是,通常你采取的方法越实用,代码就越紧凑和清晰:-)如果我可以说,最好不要在块中使用
next
,尽可能使用条件作为表达式。不知何故,map+flatten(1)=flat_-map(在许多函数语言中称为concat)这一事实尚未广为人知。请注意,您使用
reduce
手动实现了抽象
flat_-map
(也不是说使用
+
连接数组是一项繁重的操作)。@tokland,啊,是的,忘记了平面地图,你的答案是+1:)伙计,这很公平,+1用于使用递归展平器;-)
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"
sample.values.flat_map { |x| x.is_a?(Hash) ? x.values : [x] }.join("|")
#=> "1|2|abc|xyz|3"