Ruby on rails Rails:如果特定键具有相同的值,如何合并两个哈希?
如果特定键具有相同的值,我将尝试合并哈希 这是数组Ruby on rails Rails:如果特定键具有相同的值,如何合并两个哈希?,ruby-on-rails,ruby,Ruby On Rails,Ruby,如果特定键具有相同的值,我将尝试合并哈希 这是数组 [{ id: 77, member_phone: "9876543210", created_at: "2017-05-03T11:06:03.000Z", name: "Sure" }, { id: 77, member_phone: "123456789", created_at: "2017-05-03T11:06:03.000Z", name: "Sure" }, { id: 78, membe
[{
id: 77,
member_phone: "9876543210",
created_at: "2017-05-03T11:06:03.000Z",
name: "Sure"
},
{
id: 77,
member_phone: "123456789",
created_at: "2017-05-03T11:06:03.000Z",
name: "Sure"
},
{
id: 78,
member_phone: "12345",
created_at: "2017-05-03T11:06:03.000Z",
name: "XYZ"
}]
以及所需的输出:
[{
id: 77,
member_phone: "123456789,9876543210",
created_at: "2017-05-03T11:06:03.000Z",
name: "Sure"
},
{
id: 78,
member_phone: "12345",
created_at: "2017-05-03T11:06:03.000Z",
name: "XYZ"
}]
以下是我尝试的代码:
merge_users.group_by { |h1| h1["id"] }.map do |k,v|
{ "id" => k, :member_phone => v.map { |h2| h2[:member_phone] }.join(", ") }
end
我该怎么做呢?怎么样:
grouped = data.group_by do |item|
item[:id]
end
combined = grouped.map do |_id, hashes|
hashes.inject({}) do |memo, hash|
memo.merge(hash)
end
end
它分为两个步骤:
首先,根据:id
键的值对所有哈希进行分组
这将返回一个以id
为键的散列,以及一个数组(包含所有具有此id的散列)作为值
在第二个过程中,所有散列都被合并并再次映射到一个数组。以下代码适用于给定的示例 代码 p结果
#=>[{:id=>77, :member_phone=>"9876543210,123456789", :created_at=>"2017-05-03T11:06:03.000Z", :name=>"Sure"}, {:id=>78, :member_phone=>"12345", :created_at=>"2017-05-03T11:06:03.000Z", :name=>"XYZ"}]
您可以使用(akamerge!
)的形式,它使用一个块来计算合并的两个哈希中存在的键的值
arr.each_with_object({}) { |g,h| h.update(g[:id]=>g) { |_,o,n|
o.merge(phone: "#{o[:phone]}#{n[:phone]}") } }.values
#=> [{:id=>77, :phone=>"9876543210123456789", :name=>"Sure"},
# {:id=>78, :phone=>"12345", :name=>"XYZ"}]
请注意,的接收器如下所示
#=> {77=>{:id=>77, :phone=>"9876543210123456789", :name=>"Sure"},
# 78=>{:id=>78, :phone=>"12345", :name=>"XYZ"}}
有关三个块变量\uucode>、o
和n
的定义,请参见文档中的Hash#update
。我在第一个变量(局部变量的有效名称)中使用了下划线,表示在块计算中未使用该变量(一种常见做法)
请注意,Hash#update
几乎总是可以在可以使用时使用,反之亦然
这里有一种使用Hash#group_by
的方法
arr.group_by { |h| h[:id] }.
map { |_,a| a.first.merge(phone: a.map { |h| h[:phone] }.join) }
#=> [{:id=>77, :phone=>"9876543210123456789", :name=>"Sure"},
# {:id=>78, :phone=>"12345", :name=>"XYZ"}]
注意
arr.group_by { |h| h[:id] }
#=> {77=>[{:id=>77, :phone=>"9876543210", :name=>"Sure"},
# {:id=>77, :phone=>"123456789", :name=>"Sure"}],
# 78=>[{:id=>78, :phone=>"12345", :name=>"XYZ"}]}
到目前为止,您尝试了什么?键值不同member_phone和kitty_member_phone不同。@Rajagopalan很抱歉这是我的错误。@JasjeetSingh是的,我已经编写了代码,请看一下。谢谢。Bro确实节省了我的时间。考虑使用<代码> [OV,nv]。连接(′,')<代码>,而不是用<代码> OV+”、“+NV < /代码>”来生成三个中间的字符串实例。并产生了一个散列。@JasjeetSingh看看你的输出,这就是你要求的,对吗?@JasjeetSingh这是你的输出,[{id:77,成员电话:“123456789876543210”,创建地址:“2017-05-03T11:06:03.000Z”,名字:“当然”}
,这也是我的输出,区别在哪里?但它也将id与不同的值合并。
arr.group_by { |h| h[:id] }.
map { |_,a| a.first.merge(phone: a.map { |h| h[:phone] }.join) }
#=> [{:id=>77, :phone=>"9876543210123456789", :name=>"Sure"},
# {:id=>78, :phone=>"12345", :name=>"XYZ"}]
arr.group_by { |h| h[:id] }
#=> {77=>[{:id=>77, :phone=>"9876543210", :name=>"Sure"},
# {:id=>77, :phone=>"123456789", :name=>"Sure"}],
# 78=>[{:id=>78, :phone=>"12345", :name=>"XYZ"}]}