显示大型嵌套哈希的结构

问题描述

我要检查的哈希值很大,但是由于值太多,因此很难直观地看到正在发生的事情。

例如说这是哈希:

{
  days: {
    monday: [1,2,3,4],# There are thousands of values here
    tuesday: [1,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

这是一个递归方法,如果值是哈希值,它将自行运行,否则返回values类。

样本输入的结果与预期的输出匹配,但是仍有改进的余地。就像如果数组中的所有值都相同然后显示值类型(例如“整数数组”),或者如果数组包含相似的哈希值,那么这些哈希值是什么样的?

解决方法

我认为#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,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}