示例我有这个数组:
@packages = ["2", ["4", "2", "1"], "4", ["4","2"], ["5", "6"]]
2
和4
可能无法合成
应该从数组中删除["4", "2", "1"]
和["4,"2"]
应该怎么做?
所以输出结果为:@packages = ["2", "4", ["5", "6"]]
2和4只是一个例子。而且数量也各不相同。
答案 0 :(得分:2)
如果要删除与给定的do至少有2个共同元素的数组:
@packages = ["2", ["4", "2", "1"], "4", ["4","2"], ["3", "2"]]
@opposites = ["2", "4"]
@packages.reject! { |p| p.is_a?(Array) && (@opposites & p).size >= 2 }
此后@packages => ["2", "4", ["3", "2"]]
答案 1 :(得分:2)
查看数组是否同时包含"2"
和"4"
的最简单方法是使用Array#&
(即设置交集):
@packages.reject { |a| a.is_a?(Array) && (a & [ '2', '4' ]).length == 2 }
例如:
>> @packages = ["2", ["4", "2", "1"], "4", ["4","2"], ["5", "6"], ["1", "2"], ["4", "11"], ["2", "2", "4"]]
=> ["2", ["4", "2", "1"], "4", ["4", "2"], ["5", "6"], ["1", "2"], ["4", "11"], ["2", "2", "4"]]
>> @packages.reject { |a| a.is_a?(Array) && (a & [ '2', '4' ]).length == 2 }
=> ["2", "4", ["5", "6"], ["1", "2"], ["4", "11"]]
如果你的拒绝列表在一个单独的数组中,那么上面很容易概括:
rejects = %w(2 4)
@packages.reject { |a| a.is_a?(Array) && (a & rejects).length == rejects.length }
您必须确保rejects
没有任何重复项,但如果您不确定rejects
是否有重复,则可以随时添加uniq
。< / p>
答案 2 :(得分:1)
正如已经评论的那样,你的问题并不完全清楚。如果您只想删除主阵列的Array元素,那么就可以这样做。
@packages.reject{|element| element.is_a?(Array)}