如何从此阵列中删除重复项?
product_areas = [["1", "2", "3"], ["3", "1", "2"]]
我尝试了product_areas.uniq!
,product_area.uniq
,但同样的事情正在重复。我在这里缺少什么?
预期输出:
product_areas = ["1", "2", "3"]
答案 0 :(得分:10)
试试这个:
product_areas = [["1", "2", "3"], ["3", "1", "2"]].flatten.uniq
在数组上使用flatten
将创建以下结果:
["1", "2", "3", "3", "1", "2"]
当您在该阵列上调用uniq
时,您将获得您期望的结果:
["1", "2", "3"]
答案 1 :(得分:3)
如前所述
product_areas = [["1", "2", "3"], ["3", "1", "2"]].flatten.uniq
-OR -
product_areas.flatten.uniq!
会引导您达到理想的答案。
当你跑步" product_areas.uniq!"该过程是将两个内部数组相互比较,而不是每个数组的元素。由于["1", "2", "3"]
和["3", "1", "2"]
在数组中都是唯一的,因此都不会删除。举个例子说你有以下数组
product_areas = [["1", "2", "3"], ["3", "1", "2"], ["1","2","3"]]
你跑了:
product_areas = product_areas.uniq
product_areas将如下所示:
product_areas = [["1", "2", "3"], ["3", "1", "2"]]
在数组上运行任何类型的可枚举方法时,您需要注意的是它只会向下移动到每个单独的元素。因此,如果在数组内部有更多数组,那么任何迭代方法都会将内部数组视为一个整体。一些示例代码用于演示:
array_of_arrays = [[1,2,3], [4,5,6]]
array_of_arrays.each do |array|
p array
end
#---OUPUT---
# [1, 2, 3]
# [4, 5, 6]
array_of_arrays.each do |array|
array.each do |element|
p element
end
end
#---OUPUT---
# 1
# 2
# 3
# 4
# 5
# 6
答案 2 :(得分:0)
我作为Ruby on Rails开发人员在我的职业生涯中一遍又一遍地使用了这一小段代码,用一条简洁的小代码来解决这个经常遇到的问题。这段代码的最终结果是你可以调用像
这样的东西product_areas.squish
执行以下操作:
我这样做是通过在我的项目中添加一个初始化程序config/initializer/core_ext.rb
来扩展核心Ruby功能,如下所示:
class Array
def squish
blank? ? [] : flatten.compact.uniq
end
end
class NilClass
def squish
[]
end
end