通过特定的重复字段值删除子数组

时间:2019-02-07 19:44:11

标签: arrays ruby

我有:

multy_array = [
  [Jack, Fred, Jane],
  [Paul, Mattew, Gina],
  [Jack, Bart, Hector],
  [Jhon, Veronica, Nicole],
  [Marcella, Vianka, Richard]
]

我只想保留一个在数组索引[0][0]中表示唯一元素的子数组,即Jack。因此,我应该只保留第一个带有Jack的子数组,并将其他整个子数组放在索引[2]处。我想要:

[
  [Jack, Fred, Jane],
  [Paul, Mattew, Gina],
  [Jhon, Veronica, Nicole],
  [Marcella, Vianka, Richard]
]

2 个答案:

答案 0 :(得分:2)

构建哈希(Enumerable#to_h)的其他选项,其中哈希根据定义是唯一的:

multy_array.reverse.map { |e| [e.first, e] }.to_h.values

答案 1 :(得分:1)

如果您要删除在 any 位置包含 first 数组的 first 元素的数组,这将很简单{{ 1}},如下所示:

Array#reject

在这里,您要通过拒绝multi_array.reject { |arr| arr != multi_array[0] && arr.include?(multi_array[0][0]) }中不是第一个成员并且还包含该值的任何成员来创建新数组。

multi_array

编辑:

这是我的第一个答案,假设您要删除一个子数组(如果该子数组与先前的任何子数组有任何值的重复项)。

您可以使用irb(main):001:0> multi_array = [%w[Jack Fred Jane], %w[Paul Matthew Gina], %w[Jack Bart Hector], %w[John Veronica Nicole], %w[Marcella Vianka Richard]] => [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Gina"], ["Jack", "Bart", "Hector"], ["John", "Veronica", "Nicole"], ["Marcella", "Vianka", "Richard"]] irb(main):016:0> multi_array.reject { |arr| arr != multi_array[0] && arr.include?(multi_array[0][0]) } => [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Gina"], ["John", "Veronica", "Nicole"], ["Marcella", "Vianka", "Richard"]] 来构建仅那些与以前的数组没有任何重复值的数组的结果,如下所示:

#each_with_object

您正在逐步遍历数组,并将每个数组添加到结果中,只要其值均未包含在平坦化的结果中即可。

multi_array.each_with_object([]) { |a, result| result << a unless a.any? { |b| result.flatten.include?(b) } }

在这里,我将“ Richard”添加到第二个数组中,您可以看到第二个“ Jack”和第二个“ Richard”数组均被删除。

irb(main):004:0> multi_array.each_with_object([]) { |a, result| result << a unless a.any? { |b| result.flatten.include?(b) } }

=> [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Gina"], ["John", "Veronica", "Nicole"], ["Marcella", "Vianka", "Richard"]]