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