基于排序值数组对哈希数组进行排序

我有一系列哈希,如下所示:

user_quizzes = [{:id => 3897, :quiz_id => 1793, :user_id => 252}, {:id => 3897, :quiz_id => 1793, :user_id => 475}, {:id => 3897, :quiz_id => 1793, :user_id => 880}, {:id => 3897, :quiz_id => 1793, :user_id => 881}, {:id => 3897, :quiz_id => 1793, :user_id => 882}, {:id => 3897, :quiz_id => 1793, :user_id => 883}, {:id => 3897, :quiz_id => 1793, :user_id => 884}] 

此外,根据特定条件,我从同一个哈希中获取’ user_id ‘键的值并对其进行排序,并在下面给出相同的数组:

 sorted_user_ids = [880, 881, 882, 883, 884, 475, 252] 

现在,我需要根据sorted_user_ids数组中user_id的顺序重新排列sorted_user_ids

任何人都可以请帮助我。 🙂

使用Enumerable#sort_byArray#sort_by! ,您可以指定将用于比较的密钥:

 user_quizzes = [ {:id => 3897, :quiz_id => 1793, :user_id => 252}, {:id => 3897, :quiz_id => 1793, :user_id => 475}, {:id => 3897, :quiz_id => 1793, :user_id => 880}, {:id => 3897, :quiz_id => 1793, :user_id => 881}, {:id => 3897, :quiz_id => 1793, :user_id => 882}, {:id => 3897, :quiz_id => 1793, :user_id => 883}, {:id => 3897, :quiz_id => 1793, :user_id => 884} ] sorted_user_ids = [880, 881, 882, 883, 884, 475, 252] user_quizzes.sort_by { |x| sorted_user_ids.index(x[:user_id]) } # => [{:id=>3897, :quiz_id=>1793, :user_id=>880}, # {:id=>3897, :quiz_id=>1793, :user_id=>881}, # {:id=>3897, :quiz_id=>1793, :user_id=>882}, # {:id=>3897, :quiz_id=>1793, :user_id=>883}, # {:id=>3897, :quiz_id=>1793, :user_id=>884}, # {:id=>3897, :quiz_id=>1793, :user_id=>475}, # {:id=>3897, :quiz_id=>1793, :user_id=>252}] 

旁注: sorted_user_ids.index(x[:user_id])可能成为瓶颈(重复O(n)操作),如果数组很大的话。

在这种情况下构建一个将user_id映射到订单的哈希:

 sorted_user_ids = [880, 881, 882, 883, 884, 475, 252] order = Hash[sorted_user_ids.each_with_index.to_a] # => {880=>0, 881=>1, 882=>2, 883=>3, 884=>4, 475=>5, 252=>6} user_quizzes.sort_by { |x| order[x[:user_id]] } # => same as above.