从数组数组中删除重复项

时间:2015-05-01 19:28:40

标签: ruby-on-rails ruby

如何从此阵列中删除重复项?

product_areas = [["1", "2", "3"], ["3", "1", "2"]]

我尝试了product_areas.uniq!product_area.uniq,但同样的事情正在重复。我在这里缺少什么?

预期输出:

product_areas = ["1", "2", "3"]

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

执行以下操作:

  1. 将2-D阵列展平为1-D阵列
  2. 删除无元素
  3. 删除重复元素
  4. 我这样做是通过在我的项目中添加一个初始化程序config/initializer/core_ext.rb来扩展核心Ruby功能,如下所示:

    class Array
      def squish
          blank? ? [] : flatten.compact.uniq
      end
    end
    
    class NilClass
      def squish
          []
      end
    end