У меня есть большой хэш, который я пытаюсь проверить, но из-за большого количества значений трудно визуально увидеть, что происходит.

Например, скажем, это хеш:

{
  days: {
    monday: [1,2,3,4], # There are thousands of values here
    tuesday: [1,2,3,4]
  }, 
  movies: {
   action: ['Avengers', 'My Little Pony'],
   adventure: ['Dorra The Explorer'],
   comedy: ['Star Wars']
  },
  data_quality: 0.9,
  verified: true
}

Что-то идет не так, и мне нужно выяснить, что здесь происходит. Возможно, мне не хватает категории фильмов, дня недели или чего-то другого из другой области.

Поскольку массивы состоят из тысяч элементов, я не могу просто посмотреть на них, чтобы увидеть, чего не хватает.

В идеале хотелось бы примерно такого:

{
  days: {
    monday: Array,
    tuesday: Array
  }, 
  movies: {
   action: Array,
   adventure: Array,
   comedy: Array
  },
  data_quality: Float,
  verified: TrueClass
}

Это упростит анализ данных.

Это метод, который я сейчас использую:

def hash_keys(hash)
  unless hash.is_a?(Hash)
    return hash.class
  end

  keys_hash = {}
  hash.each do |key, value|
    keys_hash[key] = hash_keys(value)
  end

  keys_hash
end

Это рекурсивный метод, который запускается сам, если значение является хешем, и возвращает класс значений в противном случае.

Результат для образца ввода соответствует ожидаемому, однако есть возможности для улучшения. Например, если все значения в массиве одинаковы, тогда отображается тип значения (например, «Массив целых») или если массив содержит похожие хэши, то как эти хеши выглядят?

1
KNejad 2 Окт 2020 в 12:12

1 ответ

Лучший ответ

Я думаю, что #transform_values является идеальный вариант, чтобы помочь здесь:

def deep_values_transform(hash)
  hash.transform_values do |value|
    if value.is_a?(Hash)
      deep_values_transform(value)
    else
      value.class
    end
  end
end

 > hash = {
  days: {
    monday: [1,2,3,4],
    tuesday: [1,2,3,4]
  }, 
  movies: {
   action: ['Avengers', 'My Little Pony'],
   adventure: ['Dorra The Explorer'],
   comedy: ['Star Wars']
  },
  data_quality: 0.9,
  verified: true
}

 > deep_values_transform hash
 => {:days=>{:monday=>Array, :tuesday=>Array}, :movies=>{:action=>Array, :adventure=>Array, :comedy=>Array}, :data_quality=>Float, :verified=>TrueClass}
3
Alex Holubenko 2 Окт 2020 в 13:10