2016-09-13 56 views
2

我有一个包含空格的哈希值的散列数组。我想通过散列中的每个数组元素和每个值来删除空间中的任何空格和以下字符。我的数据的一个例子是删除数组中的第一个空白后的所有内容

arrayHash = [{:firstname=>'Anne Marie', :lastname=>'Hook', :email=>'[email protected]', :id=>1}, 
      {:firstname=>'Michael', :lastname=>'Rodriguez', :email=>'[email protected]', :id=>2}] 

因此,例如,在姓名的关键,我想借此“安妮玛丽”,减少它只是“安妮”,做同样的每个元素在该数组中。

+0

请阅读“[问]”,包括链接的页面。我们想知道你的尝试。对于我们来说,纠正你的代码比为你写代码更好,这不是它的目的。 “[Stack Overflow用户需要多少研究工作?](http://meta.stackoverflow.com/a/261593/128421)”也是一个很好的解读。 –

+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=>"[email protected]", :id=>1}, {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"[email protected]", :id=>2}] 
+0

不幸的是,这不起作用,因为这是一个散列数组而不是直接散列。这不会访问数组元素中的散列。 –

+0

@coyote_rey我不明白你的意见。运行代码并看看它是否返回您在OP –

+0

中描述的内容我已经运行了此代码,但没有看到它影响到名字值。我看到它只是在该行的输出中表示安妮,但在事实之后显示arrayHash [0]后,我仍然看到'Anne Marie' –

3

如果你想变异arrayHash,你可以做到以下几点:

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

arrayHash突变:

arrayHash 
    #=> [{:firstname=>"Anne", :lastname=>"Hook", :email=>"[email protected]", :id=>1}, 
    # {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"[email protected]", :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=>"[email protected]", :id=>1}, 
    # {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"[email protected]", :id=>2}] 

arrayHash是不变的:

arrayHash 
    #=> [{:firstname=>"Anne Marie", :lastname=>"Hook", :email=>"[email protected]", :id=>1}, 
    # {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"[email protected]", :id=>2}] 

在第二种情况下,我使用的方法Hash#merge形式它使用一个块来确定两个散列中正在合并的键的值,这里是所有键。请参阅文档以获取三个块变量值的解释(第一个和第三个块用变量表示,用下划线表示它们不用于块计算)。

相关问题