如果不是从数组中删除重复的元素,而是希望删除具有公共特定属性的元素,该怎么办?
具体地说,我希望从具有重复“essence”的数组中删除所有字符串,其中essence的定义如下:
class String
def essence
downcase.gsub('&', 'and').gsub(/[^a-z0-9]/, '')
end
end我想要这样的东西:
['a', 'A', 'b'].uniq_by(&:essence)
# => ['a', 'b'] (or ['A', 'b']; I don't really care)实现这一目标的最佳方法是什么?
发布于 2011-03-10 05:02:23
Activesupport有一个Array#uniq_by,代码如下:
class Array
def uniq_by
hash, array = {}, []
each { |i| hash[yield(i)] ||= (array << i) }
array
end
endFacets也有一个Enumerable#uniq_by
module Enumerable
def uniq_by
h = {}
inject([]) {|a,x| h[yield(x)] ||= a << x}
end
end发布于 2012-03-16 01:36:11
从1.9.2开始,Array#uniq (和uniq!)使用一个块,因此不再需要uniq_by。
发布于 2011-03-10 04:52:26
快速和肮脏的方式:
['a', 'A', 'b'].group_by {|i| i.essence}.values.map(&:first)还有一些猴子的补丁:
class Array
def uniq_by(&block)
group_by(&block).values.map(&:first)
end
endhttps://stackoverflow.com/questions/5251871
复制相似问题