Rails如何删除那个有某种组合的obj?

时间:2012-01-20 18:56:05

标签: ruby-on-rails ruby arrays ruby-on-rails-3

示例我有这个数组:

@packages = ["2", ["4", "2", "1"], "4", ["4","2"], ["5", "6"]]

24可能无法合成

应该从数组中删除["4", "2", "1"]["4,"2"]

应该怎么做?

所以输出结果为:@packages = ["2", "4", ["5", "6"]]

2和4只是一个例子。而且数量也各不相同。

3 个答案:

答案 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)}