我有一个散列数组,其中包含空格的散列内部有一些值。我想遍历每个数组元素和散列中的每个值,以删除空格中的任何空格和后面的字符。我的数据的一个例子是
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',并为这个数组中的每个元素做同样的事情。
答案 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*/
匹配字符串的开头,后跟除空白之外的零个或多个字符。对于字符串v
,v[/\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以获取三个块变量值的解释(第一个和第三个块用变量表示,表示它们未在块计算中使用)。