在数组

时间:2016-09-13 18:22:19

标签: arrays ruby hash

我有一个散列数组,其中包含空格的散列内部有一些值。我想遍历每个数组元素和散列中的每个值,以删除空格中的任何空格和后面的字符。我的数据的一个例子是

arrayHash = [{:firstname=>'Anne Marie', :lastname=>'Hook', :email=>'test@test.com', :id=>1}, 
           {:firstname=>'Michael', :lastname=>'Rodriguez', :email=>'test2@test.com', :id=>2}]

所以例如在firstname键上,我想把'Anne Marie'缩小为'Anne',并为这个数组中的每个元素做同样的事情。

2 个答案:

答案 0 :(得分:3)

arrayHash.map! do |hash|
  hash.each_with_object({}) do |(k, v), h|
    h[k] = v.is_a?(String) ? v.split(' ').first : v
  end
end
#=>[{:firstname=>"Anne", :lastname=>"Hook", :email=>"test@test.com", :id=>1}, {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"test2@test.com", :id=>2}]

答案 1 :(得分:3)

如果您想改变arrayHash,可以执行以下操作:

arrayHash.each { |h| h.each { |k,v| h[k] = v.is_a?(String) ? v[/\A\S*/] : v } }
  #=> [{:firstname=>"Anne", :lastname=>"Hook", :email=>"test@test.com", :id=>1},
  #    {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"test2@test.com", :id=>2}] 

arrayHash发生变异:

arrayHash
  #=> [{:firstname=>"Anne", :lastname=>"Hook", :email=>"test@test.com", :id=>1},
  #    {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"test2@test.com", :id=>2}] 

正则表达式/\A\S*/匹配字符串的开头,后跟除空白之外的零个或多个字符。对于字符串vv[/\A\S*/]返回匹配项。 (参见方法String#[])。

如果你不想改变arrayHash,这是一种方式:

arrayHash.map { |h| h.merge(h) { |_,v,_| v.is_a?(String) ? v[/\A\S*/] : v } }
  #=> [{:firstname=>"Anne", :lastname=>"Hook", :email=>"test@test.com", :id=>1},
  #    {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"test2@test.com", :id=>2}] 

arrayHash未更改:

arrayHash
  #=> [{:firstname=>"Anne Marie", :lastname=>"Hook", :email=>"test@test.com", :id=>1},
  #    {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"test2@test.com", :id=>2}] 

在第二种情况下,我使用了方法Hash#merge的形式,它使用一个块来确定合并的两个哈希中存在的键的值,这里是所有键。请参阅doc以获取三个块变量值的解释(第一个和第三个块用变量表示,表示它们未在块计算中使用)。