我有:
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]
]
答案 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"]]