我有一个数组:
arr = [["csb#"], ["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"], ["spl#"]]
如何删除仅包含一个元素的子数组,如["csb#"]
?
答案 0 :(得分:3)
只是为了好玩:
arr.reject {|e| e[1..-1].empty? }
=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
如果您确定阵列在nils 上不包含布尔值,则以下解决方案有效:
arr.map { |f, s, *o| [f, s, *o] if s }.compact
甚至:
arr.map { |e| e if e[1] }.compact
或与select
几乎相同(感谢@engineersmnky):
arr.select { |a| a[1] }
答案 1 :(得分:2)
您也可以使用reject
。使用!
它将改变原始数组,否则将返回一个新数组:
arr =[["csb#"], ["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"], ["spl#"]]
arr.reject {|e| e.length == 1 }
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
arr.reject! {|e| e.length == 1 }
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
arr
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
select
或select!
也可用于相同的功能:
arr = [["csb#"], ["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"], ["spl#"]]
#=> [["csb#"], ["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"], ["spl#"]]
arr.select! {|e| e.length != 1 }
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
答案 2 :(得分:1)
使用Array#delete_if
方法:
> arr.delete_if{|e| e.size == 1}
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
注意:这将通过删除仅包含1个元素的子数组来修改原始数组。
> arr
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
如果您只想获取包含多个元素的子数组:
> arr.select{|a| a.size > 1}
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
或:
> arr.reject{|a| a.size <= 1}
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]