Ruby Dizileri: seçin (), toplayın () ve eşleyin ()


107

Eşleme için sözdizimi:

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

Şunlara ne dersin:

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

Bu dizide boş bir adet değeri olan her girişi silmek veya sadece içinde bir değer olanları seçmek istiyorum.

Denedim:

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

Sadece çok fazla yanlış döndürür ve sonra aynısını kullandığımda, sadece şunu elde ettiğimi seçmek için haritayı değiştir:

[]

Yakından bakarsanız, bir dizi hash gibi görünüyor
Emily

@Emily: Çok doğru, bunu şimdi anladım. Son kod örneği beni başka türlü düşündürdü çünkü :qtyorada görünmüyor bile.
Niklas B.

Yanıtlar:


131

Görünüşe detailsgöre bir dizi karma. Yani itembloğunuzun içinde bütün hash olacaktır. Bu nedenle, :qtyanahtarı kontrol etmek için aşağıdaki gibi bir şey yaparsınız:

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

Bu size :qtyanahtarın boş bir dize olmadığı tüm öğeleri verecektir .

resmi seçme belgeleri


26

DÜZENLEME: Az önce detailsbir karma dizisi olan filtrelemek istediğinizi fark ettim . Bu durumda yapabilirdin

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

İç veri yapısının kendisi bir Dizi değil, Hash'tir. selectBurada da kullanabilirsiniz , ancak bu durumda bloğa anahtar ve değer verilir:

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

Veya rejecttersi olan kullanarak select(verilen koşulun geçerli olduğu tüm öğeler hariçtir):

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

Bunun Ruby 1.9 olduğuna dikkat edin. 1.8 ile uyumluluğu sürdürmeniz gerekiyorsa, şunları yapabilirsiniz:

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

@ingalcala: Cevabımın aslında ihtiyacınız olan şey olmadığını anladım. detailsDizinin kendisini nasıl filtreleyeceğinizi öğrenmek için lütfen düzenlememi kontrol edin .
Niklas B.

9

Bir hash ile uğraşırken, {}içindeki bloğun hem anahtarını hem de değerini kullanın ||.

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

=>[false, false, true, false, false]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.