ruby - ruby - 将深度键添加到较大散列中的每个嵌套散列
问题描述
我正在尝试编写一个将嵌套散列作为输入并返回带有添加“深度”键的散列的方法。因此,例如:
hash = {
a: 1,
b: 2,
c: { d: { e: 3 } }
}
会返回:
{
a: 1,
b: 2,
c: {
d: {
e: 3,
depth: 2
},
depth: 1
},
depth: 0
}
这是我想出的一些代码,它适用于这种情况,或者任何其他深度不超过 2 的哈希,但我的做法是错误的。我试图弄清楚如何使它适用于任何深度。
def depth(hash)
hash.values.to_a.map!{|elem| if elem.class==Hash; elem.values.to_a.map!{|el| el.class==Hash ? el[:depth] = 2 : elem}; elem[:depth] = 1; else; elem; end}
hash[:depth] = 0
p hash
end
您可以假设输入是哈希。谢谢 :-)
解决方案
与现有答案类似,但可能更惯用
def add_depth(hash, depth = 0)
hash
.transform_values { |v| v.is_a?(Hash) ? add_depth(v, depth + 1) : v }
.merge(depth: depth)
end
它基本上和其他的一样,但是将新哈希的创建和迭代委托给 ruby 核心,这可以说是更优化 的,也可能由虚拟机更好地优化。
推荐阅读
- javascript - 基于javascript中的两个属性获取数组中重复对象的列表
- c - Linux 驱动程序加载 - 在动态链接阶段解析函数名称
- docker - Docker Compose 与多个网络
- android - 在 Flutter 中捕获前台位置
- r - 在 Mac Catalina 上的 Jupyter 上使用 R:使安装全局可见不起作用
- symfony - 删除实体时如何删除file_upload(FileUploadType)上传的文件?
- css - Chrome 85 devtools 设备工具栏白框-窗口周围的阴影
- javascript - Ember 中的命名块
- python - PySpark to_json 丢失数组内结构的列名
- python - 如何通过一个 SeparableConv2D 传递多张图像?