在Hash中使用变量作为另一个Hash的键

时间:2014-09-19 10:53:39

标签: ruby

我有一些数据要以['a1', 'b321', 'a33', 'c', ...]的形式排序为数组。 我想将所有'aN'放入sorted_data[:a]等。 下面的代码遍历数据,并在它们上正确运行正则表达式。 它没有做的是将它们放在正确的位置 - sorted_data[filter[:key]]为空。 如何使用filter[:key]作为sorted_data的密钥? 感谢。

sorted_data = { a: Array.new,
                b: Array.new,
                c: -1 }

filters = [{ re: /^a\d+$/, key: 'a' },
           { re: /^b\d+$/, key: 'b' },
           { re: /^c$/,    key: 'c' }]

['a1', 'b321', 'a33', 'c', 'b', 'b1'].each {|cell|
  filters.each {|filter|
    if cell.match(filter[:re])
      puts "#{cell} should go in #{filter[:key]}" + '....[' + sorted_data[filter[:key]].to_s + ']....' 
      break
    end
  }
}

以上的输出是

# a1 should go in a....[]....
# b321 should go in b....[]....
# a33 should go in a....[]....
# c should go in c....[]....
# b1 should go in b....[]....

1 个答案:

答案 0 :(得分:0)

我相信下面的程序会产生所需的输出:

l = ['a1', 'b321', 'a33', 'c', 'b', 'b1']
sorted_data = Hash.new { |hash, key| hash[key] = [] }
l.each do |item|
  first_char = item[0].to_sym
  sorted_data[first_char].push item
end

puts sorted_data

输出:

{:a=>["a1", "a33"], :b=>["b321", "b", "b1"], :c=>["c"]}