首页 > 解决方案 > 使用数组中的值扩展散列数组

问题描述

我有这个数组

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"}
]

数据数组对于性能问题来说非常大。

标签: ruby

解决方案


您可以使用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"]}

推荐阅读