[英]How to sort an array of hashes with multiple values?
我有一个哈希数组,其中包含一个id
字段和一个weight
字段。 我可以根据weight
对其进行排序,但我还需要确保如果存在重复权重,则对id
字段进行排序。 下面是代码片段供参考。
# Input
arr = [{"id" => 10, "weight" => 23}, {"id" => 6, "weight" => 43}, {"id" => 12, "weight" => 5}, {"id" => 15, "weight" => 30}, {"id" => 11, "weight" => 5}]
arr.sort_by{|k| k["weight"]}
# Output: [{"id"=>12, "weight"=>5}, {"id"=>11, "weight"=>5}, {"id"=>10, "weight"=>23}, {"id"=>15, "weight"=>30}, {"id"=>6, "weight"=>43}]
# Expected output = [{"id"=>11, "weight"=>5}, {"id"=>12, "weight"=>5}, {"id"=>10, "weight"=>23}, {"id"=>15, "weight"=>30}, {"id"=>6, "weight"=>43}]
在上面的示例中, id = 12
和id = 11
具有重复值。 我需要在数组中的id = 12
之前有id = 11
。 我真的很感谢这方面的一些指导。 谢谢!
您也可以将Enumerable#sort_by
与数组一起使用。 请注意数组中值的顺序。
arr.sort_by {|k| k.values_at("weight", "id") }
引用Array#<=>
文档中关于Array#<=>
比较如何工作的内容:
数组以“元素方式”的方式进行比较; 使用
<=>
运算符将ary
的第一个元素与other_ary
的第一个元素进行比较,然后是每个第二个元素,等等……只要任何此类比较的结果非零(即两个对应元素不相等) ),则返回整个数组比较的结果。
您可以将Array#sort与spaceship 运算符一起使用,如下所示:
arr.sort do |a,b|
if a["weight"] == b["weight"]
a["id"] <=> b["id"]
else
a["weight"] <=> b["weight"]
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.