2012-03-28 27 views
62

sözdizimi:Yakut Diziler:() (toplamak ve harita,) (seç) haritalama

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

soru nasıl varsa ilgili:

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

Her giriş wich silmek istiyor Bu dizide boş bir qty değeri var veya yalnızca içinde bir değer olanları seçin.

Denedim:

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

sadece yanlış bir sürü döndürür. Ben seçmek için aynı sadece değişim harita kullandığınızda ve sonra ben alıyorum:

[] 
+0

Eğer yakından bakarsanız, bu bir dizi hashes gibi görünüyor – Emily

+0

@Emily: Çok doğru, bunu fark ettim. Son kod örneği bana başka türlü düşünmemi sağladı, çünkü ': qty' orada görünmüyor bile. –

cevap

67

görünüyor. Yani bloğunuzun içinde item tüm karma olacak. Bu nedenle, :qty anahtarını kontrol etmek için aşağıdaki gibi bir şey yapardım: Size :qty anahtar boş bir dize değil tüm öğeleri verecektir

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

.

6

bir karma {} ile uğraşırken, || iç bloğa anahtarı ve değerini her ikisini de kullanmak.

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

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

DÜZENLEME: Sadece sağlamalarının dizisi olan details filtre uygulamak istediğiniz gerçekleşmiştir. Bu durumda

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

iç veri yapısı kendisi Dizisi ama karma değil yapabilirdi. Ayrıca burada select kullanabilirsiniz, ancak blok bu durumda 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 select tersidir reject kullanılarak (dışlar verilen koşul tutan tüm öğeler):

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

Bunun Ruby 1.9 olduğunu unutmayın. Eğer 1.8 uyumluluğu korumak varsa, yapabileceği: details sağlamalarının bir dizidir gibi

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

@ingalcala: Cevabımın aslında ihtiyacın olan şey olmadığını anladım. Lütfen 'details' dizisinin kendisini nasıl filtreleyeceğime ilişkin düzenlememi kontrol edin. –