web-dev-qa-db-ja.com

Ruby配列:select()、collect()、およびmap()

マッピングの構文:

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}

多くのfalseを返すだけで、同じ変更マップを使用して選択すると、次のようになります:

[]
97
ingalcala

detailsはハッシュの配列のようです。したがって、ブロック内のitemはハッシュ全体になります。したがって、:qtyキーを確認するには、次のようにします。

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

これにより、:qtyキーが空の文字列ではないすべてのアイテムが提供されます。

公式セレクトドキュメント

117
Emily

編集: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"}

または、rejectの逆であるselectを使用します(指定された条件が満たされるすべてのアイテムを除外します)。

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

これはRuby 1.9であることに注意してください。 1.8との互換性を維持する必要がある場合は、次を実行できます。

Hash[h.reject { |key, value| value.empty? }]
23
Niklas B.

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

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

=>[false, false, true, false, false]
9