我有两个包含产品信息哈希的数组。数组没有以有意义的方式排序。
数组A (产品数/哈希值= 27.605)包含:
例如
[
{"itemId" => "wi225858",
"description" => "Awesome product",
"category" => "/Top products/"},
{...}
]
数组B (产品数/哈希值= 18.498)包含:
例如
[
{"itemId" => "wi225858",
"description" => "Awesome product",
"brand" => "Coolio"},
{...}
]
目标(产品/哈希值= 27.605):
例如
[
{"itemId" => "wi225858",
"description" => "Awesome product",
"category" => "/Top products/",
"brand" => "Coolio"},
{...},
{"itemId" => "wi225605",
"description" => "Brandless nice product",
"category" => "/Nice products/"},
{...}
]
itemId
是唯一的。我希望Ruby代码从A中获取itemId
,检查B是否包含具有相同itemId
的产品,如果是,则将brand
值添加到项目中。如果未找到brand
,请将其留空。
代码应该创建一个带有产品哈希值的新数组,我可以保存到JSON文件中。
我试过了:
c = []
a.each do |one|
b.each do |two|
if one['itemId'] == two['itemId']
combined_product = one.merge(two)
c << combined_product
end
end
end
我对此代码有两个问题:
c.size
返回21.022,这意味着有6.583个没有brand
的产品尚未将其转换为数组c
。我接下来可以尝试什么?
答案 0 :(得分:2)
这个SO answer显示了一种简单的方法:
(a+b).group_by { |product| product["itemId"] }.map { |k,v| v.inject(:merge) }
以下是它的工作原理:
itemId
答案 1 :(得分:1)
存在设计缺陷。你应该有哈希而不是像
这样的数组A = {
"wi225858" => {
"description" => "Awesome product",
"category" => "/Top products/"
},
...
}
和
B = {
"wi225858" => {
"description" => "Awesome product",
"brand" => "Coolio"
},
...
}
然后,你可以简单地做
A.merge(B){|_, a, b| a.merge(b)}
即使考虑将阵列转换为我建议的哈希所需的时间,它也应该比你现在所做的更快地运行。