Mảng Ruby: select (), collect () và map ()


106

Cú pháp để ánh xạ:

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 mọi mục nhập có giá trị qty trống trên mảng này hoặc chỉ chọn những mục nhập có một số giá trị trong đó.

Tôi đã thử:

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

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

[]

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

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

Câu trả lời:


131

Nó trông giống như detailsmột mảng các băm. Vì vậy, itembên trong khối của bạn sẽ là toàn bộ hàm băm. Do đó, để kiểm tra :qtykhóa, bạn làm như sau:

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

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

tài liệu lựa chọn chính thức


26

CHỈNH SỬA: Tôi vừa nhận ra rằng bạn muốn lọc details, đó là một mảng các hàm băm. Trong trường hợp đó, bạn có thể làm

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

Bản thân cấu trúc dữ liệu bên trong không phải là Mảng, mà là Hash. Bạn cũng có thể sử dụng selectở đây, nhưng khối được cung cấp 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, nghịch đảo của select(loại trừ tất cả các mục mà điều kiện đã cho giữ):

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

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

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

@ingalcala: Tôi chỉ 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 chỉnh sửa của tôi để biết cách lọc detailschính mảng.
Niklas B.

9

Khi xử lý một hàm băm {}, hãy sử dụng cả khóa và giá trị cho khối bên trong ||.

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

=>[false, false, true, false, false]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.