3

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

sample = {:a=>1, :b=>2, :c=>{:c1=>abc, :c2=>xyz}, :d=>3}

我想要的输出是:

1|2|abc|xyz|3

但是如果我使用命令:sample.values.join("|")

我的输出显示如下:

1|2|c1abcc2xyz|3

请帮我解决这个问题。提前致谢。

4

4 回答 4

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"
于 2013-04-17T12:23:50.987 回答
4
sample.values.flat_map { |x| x.is_a?(Hash) ? x.values : [x] }.join("|")
#=> "1|2|abc|xyz|3"
于 2013-04-17T12:56:46.833 回答
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" 
于 2013-04-17T12:35:58.683 回答
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"
于 2013-04-17T12:36:22.373 回答