Ruby中高效重命名哈希键并修改对应值的最优实现方法
问题描述
我有如下结构的哈希数组:
"data":[ { "Id":"1", "Name":"John" }, { "Id":"2", "Name":"Robert" }, { "Id":"3", "Name":"Steve" }, { "Name":"Tom", "Country":"USA" } ]
需要完成两个操作:
- 将所有名为
Name的键重命名为First_Name; - 将所有
First_Name值为Tom的替换为Thomas,最终得到如下结果:
"data":[ { "Id":"1", "First_Name":"John" }, { "Id":"2", "First_Name":"Robert" }, { "Id":"3", "First_Name":"Steve" }, { "First_Name":"Thomas", "Country":"USA" } ]
我目前写出了部分代码:
data.map{|h| {"First_Name"=>h['Name']} } data.map{|h| h['First_Name'] = "Thomas" if h['First_Name'] == "Tom" }
请问实现上述需求的最高效方式是什么?
高效实现方案
用一次遍历完成所有操作是最高效的——毕竟数组遍历次数越少,性能损耗越低。直接在单次map(或each)里同时处理键重命名和值替换,还能保留原哈希里的其他字段。
不修改原数据的版本
如果需要保留原数组的原始数据,用dup复制哈希后操作:
transformed_data = data.map do |hash| new_hash = hash.dup if new_hash.key?('Name') # 重命名键:删除原Name键,同时赋值给First_Name new_hash['First_Name'] = new_hash.delete('Name') # 顺便替换指定值 new_hash['First_Name'] = 'Thomas' if new_hash['First_Name'] == 'Tom' end new_hash end
直接修改原数据的版本
如果业务允许直接修改原数组,去掉dup能进一步提升性能:
data.each do |hash| if hash.key?('Name') hash['First_Name'] = hash.delete('Name') hash['First_Name'] = 'Thomas' if hash['First_Name'] == 'Tom' end end
原代码的问题说明
- 第一个
map只生成了含First_Name的新哈希,把原哈希里的Id、Country等其他字段全部丢失; - 第二个
map是在原数据上操作,但原数据里根本没有First_Name键,完全起不到作用; - 两次遍历数组做重复工作,数据量越大性能浪费越明显。
内容的提问来源于stack exchange,提问作者elrond2194
相关产品推荐
相关产品推荐

