Ruby配列:select()、collect()、map()


106

マッピングの構文:

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"}

この配列で空の数量値を持つすべてのエントリを削除するか、値が含まれるエントリのみを選択します。

私は試した:

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

多くのfalseを返し、同じものを使用すると、マップを変更して選択するだけです。

[]

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

@エミリー:とても本当です。最後のコードサンプルは、:qtyそこに表示されていないので、私には別の考えをさせました。
Niklas B.

回答:


131

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

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

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

公式の選択ドキュメント


26

編集:私はあなたがフィルタリングしたいことに気づきました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? }]

@ingalcala:私はちょうど私の答えが実際にはあなたが必要としているものではないことに気づきました。details配列自体をフィルタリングする方法については、編集内容を確認してください。
Niklas B.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.