我想按hash1的值的顺序对hash2的键进行排序。
hash2不需要包含hash1的所有值。
hash1不需要包含hash2的所有键。
如果hash2中存在一个在hash1中没有对应值的键,那么它应该排在任何现有的已排序键之下。

Hash1 = {
    p0: "q11",
    p1: "q55",
    p2: "q92",
    p3: "q77"

}

Hash2 = {
    q55: {...},
    q23: {...},
    q59: {...},
    q98: {...},
    q11: {...}
}

=>
DesiredHash = {
    q11: {...},
    q55: {...},
    q23: {...},
    q59: {...},
    q98: {...}
}

最红宝石色的方法是什么?

最佳答案

array = Hash1.map{|k, v| [k, v.to_sym]}
Hash[Hash2.sort_by{|k, _| array.index{|_, v| k == v} || array.length}]

或者,可能效率较低但较短:
array = Hash1.to_a
Hash[Hash2.sort_by{|k, _| array.index{|_, v| k == v.to_s} || array.length}]

说明(使用第二个)
Hash1将用作引用,这意味着您希望对其“索引”执行某些操作。由于散列没有索引的概念,因此必须将其转换为arrayto_a这样做。接下来,您需要按照索引Hash2的顺序对array进行排序(这意味着它将隐式地转换为一个带有键值对的数组),以便Hash2的键与array的“值”匹配。index{...}将查找此类索引。如果没有匹配项,则将分配array.length,该值大于array的任何索引。最后,您希望将这对键值转换回散列。这是由Hash[...]完成的。

07-24 21:53