Ruby - перебор вложенного хэша и подсчет значений

Несмотря на множество вопросов о вложенных хэшах, я не нашел решения своей проблемы.

Я вытягиваю строки и сопоставляю каждый символ хешу так:

numberOfChars = {}
string.each_char do |c|
    RULES.each do |key, value|
        if c === key
            numberOfChars[value] += 1
        end
    end
end

Это работало нормально и выводило что-то вроде "a появляется 3 раза", пока я не понял, что мой хеш должен быть вложенным, сродни этому:

RULES = {
    :limb {
        :colour {
            'a' => 'foo',
            'b' => 'bar'
        },         
        'c' => 'baz'
    }
}

Так как же мне получить "листовой" ключ и его ценность?

Хотя он выполняет итерации по хешу, он также должен подсчитать, сколько раз появляется каждый ключ, например, "а" появляется больше, чем "b"? Если это так, добавьте новый хеш. Но я довольно заблудился относительно того, как это будет работать на практике, не зная, как он будет перебирать вложенный хеш с самого начала.

Мне кажется, что это слишком запутанный способ сделать это, но если у кого-то есть какие-то указатели, они будут очень благодарны!

Кроме того, если это не до боли ясно, я новичок в Ruby, поэтому я, вероятно, делаю некоторые фундаментальные ошибки.

1 ответ

Решение

Вы ищете что-то подобное?

RULES = {
  :limb => {
    :colour => {
      'a' => 'foo',
      'b' => 'bar'
    },
    'c' => 'baz',
    :color => {
      'b' => 'baz'
    }
  }
}

def count_letters(hash, results = {})
  hash.each do |key, value|
    if value.kind_of?(Hash)
      count_letters(value, results)
    else
      results[key] = (results[key] || 0) + 1
    end
  end
  results
end

p count_letters(RULES)
Другие вопросы по тегам