2012-03-28 5 views
62

構文:ルビー配列:()を選択し、(収集)、およびマッピング用のマップ()

a = ["a", "b", "c", "d"]  #=> ["a", "b", "c", "d"] 
a.map {|item|"a" == item}  #=> [true, false, false, false] 
a.select {|item|"a" == item} #=> ["a"] 

私が持っているかについてであれば質問:

irb(main):105:0> details[1] 
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", 
:qty2=>"1", :price=>"5,204.34 P"} 

私はすべてのエントリーウィッヒを削除したいですこの配列に空のqty値があるか、または値があるものだけを選択します。

私が試した:

details.map {|item|"" == item} 

をちょうど偽の多くを返します。私が選択するのと同じだけの変更マップを使用する場合、次に私が取得:

[] 
+0

よく見ると、ハッシュの配列のように見えます。 – Emily

+0

@エミリー:非常に真実です、私はそれを実感しました。最後のコードサンプルでは、​​ ':qty'がそこに現れないので、私は別の考え方になりました。 –

答えて

67

に見えます。したがってブロック内にあるitemはハッシュ全体になります。したがって、:qtyキーをチェックするためには、次のような何かをしたい:あなた:qtyキーが空の文字列ではなく、すべてのアイテムを与える

details.select{ |item| item[:qty] != "" } 

を。

6

ハッシュ{}を扱う場合、||内部のブロックにキーと値の両方を使用します。

details.map {|key,item|"" == item} 

=>[false, false, true, false, false] 
16

編集:私はちょうどあなたがハッシュの配列である、detailsをフィルタリングする実現。その場合、あなたは

details.reject { |item| item[:qty].empty? } 

内部データ構造自体はアレイが、ハッシュではありません行うことができます。あなたもここでselectを使用することができますが、ブロックはこの場合、キーと値を与えられます。

irb(main):001:0> h = {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", :qty2=>"1", :price=>"5,204.34 P"} 
irb(main):002:0> h.select { |key, value| !value.empty? } 
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", 
    :qty2=>"1", :price=>"5,204.34 P"} 

それともselectの逆数(所与の条件が成立するためにすべての項目を除く)であるrejectを、使用して:

h.reject { |key, value| value.empty? } 

これはRuby 1.9です。あなたは1.8との互換性を維持する必要がある場合は、行うことができます:detailsは、ハッシュの配列があるよう

Hash[h.reject { |key, value| value.empty? }] 
+0

@ingalcala:私は自分の答えが実際にあなたが必要としているものではないことに気付きました。 'details'配列自体をフィルタリングする方法については、私の編集を確認してください。 –

関連する問題