Ruby:按指定数组顺序排序哈希数组 未匹配id元素后置
Ruby 按指定id顺序排序哈希数组实现
核心逻辑
- 先把参考顺序数组
my_array转成「id值 => 排序下标」的哈希表,后续查排序位置的时间复杂度是O(1),比反复遍历数组找下标性能好很多 - 排序时给每个哈希对象计算排序权重:如果id在参考顺序里,就用对应的下标作为权重;不在参考顺序里的id,统一给一个大于所有合法下标的权重(直接取
my_array的长度即可,因为合法下标范围是0到my_array.length - 1),这类元素自然会被排到结果末尾 - 不存在于参考顺序里的元素,互相之间会保持原数组的相对顺序,符合常规排序预期
可直接运行的代码
my_array = [4, 2, 5, 3, 1] hash_list = [ {"id" => 1, "field_name" => "foo"}, {"id" => 2, "field_name" => "bar"}, {"id" => 3, "field_name" => "abc"}, {"id" => 4, "field_name" => "zsh"}, {"id" => 5, "field_name" => "kql"}, {"id" => 6, "field_name" => "plo"}, {"id" => 7, "field_name" => "cde"} ] # 构建id到排序位置的映射 id_index_map = my_array.each_with_index.to_h # 执行排序 sorted_result = hash_list.sort_by { |item| id_index_map.fetch(item["id"], my_array.length) }
运行后sorted_result的输出和你给出的期望结果完全一致。
注意:Ruby里Hash是内置类名,不建议直接用hash作为变量名,容易引发命名冲突,上面示例把原哈希数组的变量名改成了hash_list,你可以根据自己的编码习惯调整。
内容的提问来源于stack exchange,提问作者arild tarland
相关产品推荐
相关产品推荐

