说我有这个哈希:
hash = { :c => "three", :a => "one", :b => "two" }
我希望最后有这个:
one, two, three
现在说这很好地嵌套在不同的哈希中。我想避免这样的事情:
puts "#{bigger_hash[0].hash[:a]}, #{bigger_hash[0].hash[:b]}, #{bigger_hash[0].hash[:c]}"
我知道map
的这个表单可以让我在没有定义顺序的情况下做这样的事情:
bigger_hash[0].hash.map{|k,v| v}.join(', ')
将输出:
three, one, two
这消除了灵活性。我想按照我想要的顺序明确地解决这些问题(不一定是数字或字母!)
我可以用一种方便的方法来达到这个目的吗?我正在思考以下几点:
bigger_hash[0].hash.magic{"#{a}, #{b} #{c}"}
# or
bigger_hash[9].hash.magic(:a, :b, :c).join(', ')
答案 0 :(得分:1)
也许这是你的答案:
bigger_hash[9].hash.values_at(:a, :b, :c).join(', ')
答案 1 :(得分:1)
bigger_hash
返回什么?我不确定你在寻找什么,但据我所知你想要按keys
对哈希进行排序并返回values
。检查一下:
> hash = { :c => "three", :a => "one", :b => "two" }
> hash.sort.map{|e| e[1] }.join(' , ')
=> "one , two , three" # your expected output
或强>
> hash.values_at(:a, :b, :c).join(', ')
=> "one, two, three"
答案 2 :(得分:0)
您也可以使用此类型:
hash = { :c => "three", :a => "one", :b => "two" }
Hash[hash.sort].values.join(", ")
# => "one, two, three"
但在这种情况下,map方法更好。
答案 3 :(得分:0)
首先,应该定义排序功能:
sorter = lambda { |o1, o2| o1 <=> o2 }
然后,您可以根据需要对值进行排序:
hash = { :c => "three", :a => "one", :b => "two" }
hash.sort(&sorter).to_h.values.join(', ')
#⇒ one, two, three
E.g。对于逆序,我们得到:
sorter = lambda { |o1, o2| o2 <=> o1 }
hash.sort(&sorter).to_h.values.join(', ')
#⇒ three, two, one
旧版红宝石没有#to_h
方法:
hash.sort(&sorter).map(&:last).join(', ')
原位分拣机:
hash.sort(&lambda{ |o1,o2| o1 <=> o2 }).map(&:last).join(', ')
#⇒ "one, two, three"
希望它有所帮助。