Ruby on rails 如何返回包含每个所有者名称的文件名数组的哈希?

Ruby on rails 如何返回包含每个所有者名称的文件名数组的哈希?,ruby-on-rails,ruby,Ruby On Rails,Ruby,有一个名为“文件”的哈希,如下所示: files = { 'file1.txt' => 'John', 'file2.rb' => 'Andrew', 'file3.txt' => 'John' } 预期结果: 一种方法,该方法将此哈希值作为参数,并返回包含文件数组的哈希值 各自的所有者。例如 { 'John' => ['file1.txt','file3.txt'], 'Andrew' => ['fil

有一个名为“文件”的哈希,如下所示:

files = {
       'file1.txt' => 'John',
       'file2.rb'  => 'Andrew',
       'file3.txt' => 'John'
}
预期结果:

一种方法,该方法将此哈希值作为参数,并返回包含文件数组的哈希值 各自的所有者。例如

{
  'John'   =>  ['file1.txt','file3.txt'],
  'Andrew' =>  ['file2.rb']
}



在这里,您希望迭代文件散列,对于每个键值对,您需要检查它是否已经存在于新散列中,然后您只需要将文件名添加到数组中,或者创建一个新的键值对

def change_hash(file_hash)
  new_hash = {}
  file_hash.each do |file_name, person|
    if new_hash[person]
      new_hash[person] << file_name
    else
      new_hash[person] = [file_name]
    end
  end
  new_hash
end
def change\u散列(文件散列)
新的_散列={}
file_hash.each do| file_姓名、人员|
如果新的\u散列[人]

新建\u散列[person]您可以将
每个
替换为
每个
对象,并使用临时散列对象。要进一步采纳@Sebastian的建议,
def change\u散列(文件);文件。每个带有对象的对象({}){{(文件名,个人),新的散列(新的散列[person]|=[]),即使我使用
每个带有对象的方法,我也没有将其缩短为
(新的散列[person]|=[])
,继续使用
散列[value]=
way。谢谢@CarySwoveland;)有很多方法可以重构这个答案,但是从我想用一个简单易读的解决方案的问题来看!:)谢谢你的建议!你可以写
groupby(&:last)
。这是一个纯Ruby的问题,所以你不应该有Rail的标签。
files.
  group_by(&:last). # {"John"=>[["file1.txt", "John"], ["file3.txt", "John"]], "Andrew"=>[["file2.rb", "Andrew"]]}
  transform_values { |v| v.map(&:first) } # {"John"=>["file1.txt", "file3.txt"], "Andrew"=>["file2.rb"]}