Ruby数组:select(),collect()和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"] 

问题如果我有:

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

我想删除在这个数组上有一个空的qty值的每个条目,或者只select那些有一些值的条目。

我试过了 :

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

只是返回了很多的错误。 然后当我使用相同的只是改变地图select我得到:

 [] 

它看起来像details是一个哈希数组。 所以你的块内的item将是整个哈希。 因此,要检查:qty键,你可以做如下的事情:

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

这将给你所有的项目:qty键不是一个空string。

编辑:我只是意识到你想过滤details ,这是一个哈希数组。 在这种情况下,你可以做

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

内部数据结构本身不是一个数组,而是一个哈希。 你也可以在这里使用select ,但是在这种情况下块被赋予键和值:

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

或者使用reject ,这是select的倒数(不包括给定条件成立的所有项目):

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

请注意,这是Ruby 1.9。 如果你必须保持与1.8的兼容性,你可以这样做:

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

在处理散列{} ,请在||内部使用键和值 。

 details.map {|key,item|"" == item} =>[false, false, true, false, false]