[英]Ruby modify and add a hash value in array of hashes
我正在尝试使用collect!
修改哈希数组collect!
。 对于每个哈希,我想添加1个新键/值并修改不同的键/值。 但是,我在使用sub!
修改现有哈希值时遇到问题sub!
。 它似乎完全用单个数组条目替换哈希值等于sub的结果! 命令
paths = [{:path=>"bin/ruby/file1", :tag=>"v_10"}, {:path=>"usr/name/subdir/file2", :tag=>"v_12"}]
paths.collect! do |x|
x.merge(Hash[:file => x[:path].sub(/.*\//,"")]) # Grab file name
x[:path].sub!(/\/\w+$/,"") # remove file name from path
end
结果:
=> ["bin/ruby", "usr/name/subdir"]
期望的结果:
=> [{:path=>"bin/ruby", :tag=>"v_10", :file=>"file1"}, {:path=>"usr/name/subdir", :tag=>"v_12", :file=>"file2"}]
你不想collect!
,你想要each
。 收集将输入哈希映射到每个块的输出,并且块的输出是.sub
调用的结果,这意味着您获得了一个变换的平面数组:path
值。
您也可以直接设置密钥:file
,而不是构建新的哈希并尝试合并它:
paths = [{:path=>"bin/ruby/file1", :tag=>"v_10"}, {:path=>"usr/name/subdir/file2", :tag=>"v_12"}]
paths.each do |x|
x[:file] = x[:path].sub(/.*\//, '')
x[:path].sub!(/\/\w+$/,"") # remove file name from path
end
puts paths.inspect # [{:path=>"bin/ruby", :tag=>"v_10", :file=>"file1"}, {:path=>"usr/name/subdir", :tag=>"v_12", :file=>"file2"}]
功能样式版
paths.map do |path|
parts = path[:path].split('/');
{
:path => parts.first(parts.length - 1).join('/'),
:tag => path[:tag],
:file => parts.last
}
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.