ruby - 使用数组中的值扩展散列数组
问题描述
我有这个数组
types = ['first', 'second', 'third']
和这个哈希数组
data = [{query: "A"}, {query: "B"}, {query:"C", type: 'first'}]
现在,如果不存在,我必须用每种类型的数据“扩展”每个哈希。哈希的所有现有键也必须复制(例如:查询)。所以最终的结果一定是:
results = [
{query: "A", type: 'first'}, {query: "A", type: "second"}, {query: "A", type: "third"},
{query: "B", type: 'first'}, {query: "B", type: "second"}, {query: "D", type: "third"},
{query: "C", type: 'first'}, {query: "C", type: "second"}, {query: "C", type: "third"}
]
数据数组对于性能问题来说非常大。
解决方案
您可以使用Array#product
组合两个数组并Hash#merge
添加:type
键:
data.product(types).map { |h, t| h.merge(type: t) }
#=> [
# {:query=>"A", :type=>"first"}, {:query=>"A", :type=>"second"}, {:query=>"A", :type=>"third"},
# {:query=>"B", :type=>"first"}, {:query=>"B", :type=>"second"}, {:query=>"B", :type=>"third"},
# {:query=>"C", :type=>"first"}, {:query=>"C", :type=>"second"}, {:query=>"C", :type=>"third"}
# ]
请注意,上面将用数组:type
中的值替换现有值。(每个哈希types
只能有一个):type
如果您需要更复杂的逻辑,您可以传递一个块来merge
处理现有/冲突的键,例如:
h = { query: 'C', type: 'first' }
t = 'third'
h.merge(type: t) { |h, v1, v2| v1 } # preserve existing value
#=> {:query=>"C", :type=>"first"}
h.merge(type: t) { |h, v1, v2| [v1, v2] } # put both values in an array
#=> {:query=>"C", :type=>["first", "third"]}
推荐阅读
- spring-boot - 关于将 spring-data-rest-hal-browser 依赖项添加到我的 Spring Boot 应用程序(v 2.2.4)-我的应用程序无法启动。如何修复它?
- ionic-framework - Ionic 4 拦截 android 后退按钮进行导航
- windows - 将歌曲名称和艺术家添加到文件属性的 Scipt
- spring - 此行为的 Spring 自定义注释
- javascript - Javascript点击功能一次只选择第一个元素或所有元素
- sharepoint - SharePoint:对文件夹和文档集的编程复制/移动操作是否保证是原子的?
- android - Android TextView ellipsize 与 RTL 文本错误
- r - 部分函数保持其签名
- haskell - 在 Haskell 中自动运行单元测试
- javascript - 如何为图像添加上滑动画?