2016-09-13 8 views
2

スペースを含むハッシュ内にいくつかの値を持つハッシュの配列があります。私はすべての配列要素とハッシュ内のすべての値をすべて空白とそのスペースを通過する次の文字を削除するために実行したいと思います。私のデータの例は、だから、ファーストネームのキーに例えば、私は「アンネマリー」を取ると、ちょうど「アン」それを削減したいと考えており、この配列のすべての要素に対して同じことを行う配列内の最初の空白の後のすべてを削除します。

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

だろう。

+0

リンク先ページを含めて[ask]をお読みください。私たちはあなたが試したことを知りたいです。私たちがあなたのコードを修正する方が良いのは、あなたのためにコードを書くことです。これはSOのためではありません。 "[どのくらいの研究努力が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

で説明したものを返すことを確認してください。このコードを実行しましたが、firstnameの値に影響していません。私はその行の出力でちょうどAnneと言っているが、配列ハッシュ[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*/正規表現または空白以外の文字以上。文字列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=>"[email protected]", :id=>1}, 
    # {:firstname=>"Michael", :lastname=>"Rodriguez", :email=>"[email protected]", :id=>2}] 

arrayHashは変更されません:私は、メソッドの形式を使用していた第2のケースで

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

Hash#mergeブロックを使用して両方のハッシュに存在するキーの値をマージします。これはすべてのキーです。 3つのブロック変数の値の説明については、docを参照してください(最初と3番目はブロック計算で使用されていないことを示すためにアンダースコアで表されています)。

関連する問題