【发布时间】:2015-01-14 23:02:16
【问题描述】:
我有以下两个哈希:
db = {"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city" }
csv = {"1" => "first_name", "2" => "last_name", "5" => "status", "7" => "address", "10" => "city" }
我想根据 db 来排序 csv,如果 csv 中有任何键不在 db 中,那么我想将它们移动到 csv 的末尾,所以在上面的示例中结果如下所示:
{"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city", "7" => "address" }
由于键“7”不在 db hash 中,我们只是将其移至 csv hash 的末尾。
这是我尝试过的:
db = {"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city" }
csv = {"1" => "first_name", "2" => "last_name", "5" => "status", "7" => "address", "10" => "city" }
rejects = csv.reject {|k| db.include? k }
result = csv.keep_if {|k,_| db.include? k }
result.merge!(rejects)
result
=> {"1"=>"first_name", "2"=>"last_name", "5"=>"status", "10"=>"city", "7"=>"address"}
它似乎工作。但是能保证有效吗?合并是否总是将第二个哈希放在最后,或者合并是否有可能将哈希混合在一起而不考虑顺序?
【问题讨论】:
-
您不需要对
csv中存在于db中的键重新排序? -
@sawa 在 db 中但不在 csv 中的键应附加到 csv 的末尾。 db中key的顺序无关紧要,但都必须在csv hash的末尾。
-
我不是在问“在 db 中但不在 csv 中的键”,而是在问“在 db 中但在 csv 中的键”。
-
@sawa csv 中的键必须与 db 中键的顺序匹配。这是必须的,但是 db 中的额外内容可以被扔到 csv 的末尾并且顺序无关紧要,只要它们在两个哈希之间匹配的键之后。
-
为什么要对哈希进行排序?它对你没有好处。取而代之的是,抓住键,按你想要的顺序排列它们,然后使用
hash.values_at(*keys)按你需要的顺序获取值。
标签: ruby