繁体   English   中英

Ruby修改并在哈希数组中添加哈希值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM