2012-03-28 33 views
62

cú pháp để lập bản đồ:của Ruby Mảng: select(), thu thập(), và bản đồ()

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

câu hỏi làm thế nào về nếu tôi có:

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

Tôi muốn xóa tất cả Mà nhập có giá trị qty trống trên mảng này hoặc chỉ chọn giá trị có giá trị trong đó.

tôi đã cố gắng:

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

chỉ trả về rất nhiều sai lầm. và sau đó khi tôi sử dụng cùng một bản đồ chỉ thay đổi để chọn tôi nhận được:

[] 
+0

Nếu bạn nhìn kỹ, có vẻ như đó là một mảng băm – Emily

+0

@Emily: Rất đúng, tôi vừa mới nhận ra điều đó. Mẫu mã cuối cùng khiến tôi nghĩ khác, bởi vì ': qty' thậm chí không xuất hiện ở đó. –

Trả lời

67

Có vẻ như details là một mảng băm. Vì vậy, item bên trong khối của bạn sẽ là toàn bộ băm. Vì vậy, để kiểm tra phím :qty, bạn muốn làm điều gì đó như sau:

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

Điều đó sẽ cung cấp cho bạn tất cả các mục trong đó phím :qty không phải là một chuỗi rỗng.

6

Khi giao dịch với một hash {}, sử dụng cả hai chìa khóa và giá trị so với khối bên trong ||.

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

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

EDIT: Tôi chỉ nhận ra bạn muốn lọc details, mà là một mảng băm. Trong trường hợp đó bạn có thể làm

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

Cấu trúc dữ liệu bên trong bản thân không phải là một mảng, nhưng một Hash. Bạn cũng có thể sử dụng select ở đây, nhưng khối được đưa ra chìa khóa và giá trị trong trường hợp này:

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

Hoặc sử dụng reject, đó là nghịch đảo của select (không bao gồm tất cả các mục mà điều kiện cho tổ chức):

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

Lưu ý rằng đây là Ruby 1.9. Nếu bạn phải duy trì tính tương thích với 1,8, bạn có thể làm:

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

@ingalcala: Tôi vừa nhận ra rằng câu trả lời của tôi không thực sự là những gì bạn cần. Vui lòng kiểm tra bản chỉnh sửa của tôi để biết cách lọc chính mảng 'chi tiết'. –

Các vấn đề liên quan