Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:如果特定键具有相同的值,如何合并两个哈希?_Ruby On Rails_Ruby - Fatal编程技术网

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"}]
您可以使用(aka
merge!
)的形式,它使用一个块来计算合并的两个哈希中存在的键的值

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