2014-09-19 2 views
0

У меня есть некоторые данные для сортировки в виде массива в форме ['a1', 'b321', 'a33', 'c', ...]. Я хочу поместить все «aN» в sorted_data[:a] и т. Д. Код ниже проходит через данные и корректно запускает регулярное выражение. То, что он не делает, это поместить их в нужное место - sorted_data[filter[:key]] is null. Как использовать 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....[].... 
+0

Может быть, потому что ': а ! = 'a''? –

+0

Не могли бы вы быть более полезными? – gotofritz

+0

'sorted_data' имеет символьные ключи (': a,: b,: c'), 'фильтры' определяют ключи как строки (' "a", "b", "c" ') –

ответ

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"]} 
+0

Ну, что мне нужно сделать сложнее, я упростился, чтобы задать вопрос - мне нужен RegExp. Но спасибо, ваш ответ показал мне, что я делаю неправильно - мне нужен был to_sym! – gotofritz

+1

О, хорошо ... Я думал, что вы используете регулярное выражение только для идентификации каждого элемента массива. Рад, что смог помочь – arturhoo

Смежные вопросы