【问题标题】:Sort two array of hashes by the same criteria on Ruby在 Ruby 上按相同的标准对两个哈希数组进行排序
【发布时间】:2025-12-25 06:05:06
【问题描述】:

我正在使用两个这样的哈希数组来研究 Ruby:

a = [{'name'=> 'Ana', 'age'=> 42 },
     {'name'=> 'Oscar', 'age'=> 22 },
     {'name'=> 'Dany', 'age'=> 12 }]

b = [{'name'=> 'Dany', 'country'=> 'Canada' },
     {'name'=> 'Oscar', 'country'=> 'Peru'},
     {'name'=> 'Ana', 'country'=>'France'}]

我是这样排序的:

a.sort_by!{|c| c['name']}
b.sort_by!{|c| c['name']}

它可以工作,但是因为我在两个数组上都做了同样的事情,所以我想在一行中做同样的事情;我的意思是,一次对两个数组进行排序。

我该怎么做?

【问题讨论】:

  • 它是两个独立的数组,你为什么指望可以同时排序呢?
  • 因为功能和标准是一样的。
  • 您是要对它们进行组合和排序(下面的前两个答案就是这样做的),还是要分别对它们进行排序并最终得到两个数组?

标签: arrays ruby sorting hash


【解决方案1】:

只需将它们放在一个数组中。

a = [{'name'=> 'Ana', 'age'=> 42 },
     {'name'=> 'Oscar', 'age'=> 22 },
     {'name'=> 'Dany', 'age'=> 12 }]

b = [{'name'=> 'Dany', 'country'=> 'Canada' },
     {'name'=> 'Oscar', 'country'=> 'Peru'},
     {'name'=> 'Ana', 'country'=>'France'}]

[a, b].each{|ar| ar.sort_by!{|c| c['name']}}
p b # => [{"name"=>"Ana", "country"=>"France"}, {"name"=>"Dany", "country"=>"Canada"}, {"name"=>"Oscar", "country"=>"Peru"}]

【讨论】:

    【解决方案2】:

    更简单的方法-

      a.zip(b).flatten.sort_by!{|c| c['name']})
    

    【讨论】:

    • 我认为您误解了这个问题。 OP想要对每个数组进行排序,而不是以某种方式组合数组,然后排序。此外,zip 在这里有点奇怪:require 'set'; a.zip(b).flatten.to_set == a.concat(b).flatten.to_set #=> true。也就是说,a.zip(b).flatten 生成与a.concat(b).flatten 相同的数组,只是顺序不同,似乎没有任何意义。此外,当数组大小不同时,zip 会出现问题。