寻找一种优雅的方式以特殊的方式合并两个散列数组:
new_data = [{"name" => "a"}, {"name" => "b"}, {"name" => "c"}]
old_data = [{"name" => "a", "data" => "extra1"}, {"name" => "d", "data2" => "extra"}]
result = [{"name" => "a", "data" => "extra1"}, {"name" => "b"}, {"name" => "c"}]
如果名称关键字匹配,则结果必须包含< code>new_data的所有名称散列,仅包含< code>old_data的额外数据。
我的第一次尝试是这样的,但是它创建了一个额外的散列:
def combine(new_data, old_data)
int = []
new_data.each do |s|
old_data.each do |e|
(int << (s.merge e)) if e["name"] == s["name"]
end
int << s
end
int
end
# => [{"name"=>"a", "data"=>"extra1"}, {"name"=>"a"}, {"name"=>"b"}, {"name"=>"c"}]
假设
我假设:
new_data old_data
中,
“名称”
的值都是唯一的;new_data
是一个包含一个键值对的哈希数组;和 old_data
是一个包含至少两个键值对的哈希数组。密码
def extract_elements(new_data, old_data)
(new_data+old_data).group_by { |h| h["name"] }.
values.
select { |a| a.size > 1 || a.first.size == 1 }.
map(&:last)
end
实例
new_data = [{"name" => "a"}, {"name" => "b"}, {"name" => "c"}]
old_data = [{"name" => "a", "data" => "extra1"},
{"name" => "d", "data2" => "extra"}]
extract_elements(new_data, old_data)
#=> [{"name"=>"a", "data"=>"extra1"}, {"name"=>"b"}, {"name"=>"c"}]
解释
对于上面的例子:
a = (new_data+old_data)
#=> [{"name"=>"a"}, {"name"=>"b"}, {"name"=>"c"},
# {"name"=>"a", "data"=>"extra1"}, {"name"=>"d", "data2"=>"extra"}]
b = a.group_by { |h| h["name"] }
#=> {"a"=>[{"name"=>"a"}, {"name"=>"a", "data"=>"extra1"}],
# "b"=>[{"name"=>"b"}],
# "c"=>[{"name"=>"c"}],
# "d"=>[{"name"=>"d", "data2"=>"extra"}]}
c = b.values
#=> [[{"name"=>"a"}, {"name"=>"a", "data"=>"extra1"}],
# [{"name"=>"b"}],
# [{"name"=>"c"}],
# [{"name"=>"d", "data2"=>"extra"}]]
d = c.select { |a| a.size > 1 || a.first.size == 1 }
#=> [[{"name"=>"a"}, {"name"=>"a", "data"=>"extra1"}],
# [{"name"=>"b"}],
# [{"name"=>"c"}]]
e = d.map(&:last)
#=> [{"name"=>"a", "data"=>"extra1"},
# {"name"=>"b"},
# {"name"=>"c"}]
但书
这需要Ruby v1.9,因为它需要为哈希<code>b</code>维护密钥插入顺序。对于早期版本,请替换:
map(&:last)
跟:
map { |h| h.max_by(&:size) }
这有点棘手,但是您可以通过从new_data
转换为查找哈希来解决它,然后遍历old_data
以合并内容:
new_data = [{"name" => "a"}, {"name" => "b"}, {"name" => "c"}]
old_data = [{"name" => "a", "data" => "extra1"}, {"name" => "d", "data2" => "extra"}]
# Transform into a lookup table using "name" as a key
lookup = Hash[new_data.collect { |v| [ v['name'], v ] }]
old_data.each do |data|
# Match based on "name"
found = lookup[data['name']]
next unless (found)
# If found, swap out the element with a merged version
# so the original is preserved as-is, not mangled.
lookup[data['name']] = found.merge(data)
end
lookup.values
# => [{"name"=>"a", "data"=>"extra1"}, {"name"=>"b"}, {"name"=>"c"}]
一行程序,但在大型场景中可能不太有效。
new_data.map{ |e| e.merge(old_data.detect{ |e2| e2['name'] == e['name'] } || {}) }
所以,我有一个带有数组的哈希,就像这样: 我想将它们合并到一个哈希数组中,组合相应的元素。 结果应该是这样的: 知道如何有效地做到这一点吗? 请注意,真实世界的使用场景可能包含数量可变的散列键。
我有两个哈希数组: 我想在< code>a2中找到其< code>ID和< code>name字段与< code>a1中条目的< code>ID和< code>name字段相匹配的散列(不考虑< code>email或任何其他进入< code>a2的项目),然后将< code>ORDER_NO的值合并到< code>a1散列中也就是说,以下列方式结束: 我也想忽略 a2 中存在的元素,但不忽略 a
我有两个二维数组: 在第一个 2D 阵列中,我有 2 个子阵列(实际上有 16 个) - 每个产品一个。它们中的每一个都为同一产品列出了不同的名称(每个产品可以有 1 到 22 个备用名称)。 在第二个 2D 阵列中,我有 2 个子阵列(实际上也有 16 个) - 每个产品每个价目表一个。它们中的每一个都列出了来自前一个 2D 数组中相应子数组的同一产品(实际上为 10 个价格选项)的不同价格(实
对于一个电子商务应用程序,我试图将选项的散列(每个选项都有一个选择数组)转换为表示这些选择组合的散列数组。例如: 输入内部可能有其他选项,每个选项的选项数量不确定,但它只会嵌套 1 级深。任何
我想将两个哈希数组合并到一个新数组中: 现在这就是我正在寻找的结果: 我在Ruby文档中唯一能找到的合并选项是用另一个散列覆盖重复项。那么如何才能达到我需要的版本呢?
嗨,我有两个哈希数组,如下所示 如何将它们合并到单个哈希数组中作为〔{“name”= 因为我需要根据哈希转换的管道分隔cucumber表来验证它们,例如|name|value|rihan|true||gihan|true| 对于cucumber表,我使用以下函数将其转换为哈希 对于实际的 JSON 响应,我正在使用递归函数将其提取到两个哈希数组 [A] 和 [B] 上方,但我不确定如何合并它们以与