映射语法:
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值的每个条目,或者只选择其中包含某些值的条目。
我试过了:
details.map {|item|"" == item}
只返回很多假,然后当我使用相同的改变地图来选择我得到:
[]
答案 0 :(得分:106)
看起来details
是一个哈希数组。所以你的块里面的item
将是整个哈希。因此,要检查:qty
密钥,您需要执行以下操作:
details.select{ |item| item[:qty] != "" }
这将为您提供:qty
键不是空字符串的所有项目。
答案 1 :(得分:22)
编辑:我刚刚意识到您要过滤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? }]
答案 2 :(得分:8)
处理哈希{}
时,请同时使用||
内的块的键和值。
details.map {|key,item|"" == item}
=>[false, false, true, false, false]