2012-03-28 8 views
62

składni dla mapowania:Ruby Tablice: select(), zebrać() i 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"] 

pytanie, jak o tym, czy mam:

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

chcę usunąć wszelkie Wich wejścia ma pustą wartość qty w tej tablicy lub wybierz tylko te z pewną wartością.

Próbowałem:

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

prostu zwraca dużo fałszywe. a następnie, kiedy używać tego samego prostu zmienić mapę, aby wybrać uzyskać:

[] 
+0

Jeśli przyjrzysz się uważnie, wygląda na to, że jest to szereg skrótów. – Emily

+0

@Emily: To prawda, właśnie to sobie uświadomiłem. Ostatnia próbka kodu sprawiła, że ​​myślałem inaczej, ponieważ ': qty' nawet się tam nie pojawia. –

Odpowiedz

67

Wygląda details jest tablicą skrótów. Więc wewnątrz twojego bloku będzie cały hasz. Dlatego, aby sprawdzić klucz :qty, można zrobić coś jak poniżej:

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

który daje wszystkie przedmioty gdzie klucz :qty nie jest pustym ciągiem.

6

Gdy mamy do czynienia z hash {} używać zarówno klucz i wartość bloku wewnątrz ||.

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

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

EDIT: Właśnie uświadomiłem sobie, chcesz filtrować details, który jest tablicą skrótów. W takim przypadku można zrobić

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

Sama wewnętrzna struktura danych nie jest tablicą, ale Hash. Można również użyć select tutaj, ale blok jest dany klucz i wartość, w tym przypadku:

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

lub używając reject, który jest odwrotnością select (Nie obejmuje wszystkie elementy, dla których dany warunek jest spełniony):

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

Należy pamiętać, że jest to Ruby 1.9. Jeśli trzeba zachować zgodność z 1,8, można zrobić:

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

@ingalcala: Właśnie zdałem sobie sprawę, że moja odpowiedź nie jest w rzeczywistości tym, czego potrzebujesz. Sprawdź moją edycję, jak filtrować samą tablicę 'details'. –