2011-08-30 40 views
4

我试图只显示一个数组中只包含名称的重复值。试图只显示重复的值

因此,举例来说,我的代码是:

<%= s= arrayOfStuff %> 
    <%= t= arrayOfStuff.uniq %> 

,显示

["UK01USV005", "NJ08APP516", "NJ08MHF001", "UK01USV505", "NY01MHF0006", "UK01USV525", "UK01USV005", "NJ08APP515", "NJ08MHF002"] 
["UK01USV005", "NJ08APP516", "NJ08MHF001", "UK01USV505", "NY01MHF0006", "UK01USV525", "NJ08APP515", "NJ08MHF002"] 

所以theortically当我做s-t应该不过给我重复的值,在这种情况下是UK01USV005,我得到的结果是一个空数组,显然看起来像这样:[]

任何想法,为什么这可能是?

回答

10
arrayOfStuff.group_by {|e| e}.select { |k,v| v.size > 1}.keys 

应该可以正常工作。

+1

而且这也起到了作用:D – omarArroum

+0

顺便说一句,只发现了关于group_by今天,所以这将是一个很大的帮助未来的参考;-) – omarArroum

+0

ActiveSupport中有很多很好的功能为Ruby Core。见https://github.com/rails/rails/tree/master/activesupport/lib/active_support/core_ext :) – lucapette

5

你错了。不仅

a.inject([]){|ar, item| b.include?(item) ? b.delete(item) : ar << item; ar} 
#=> ["UK01USV005"] 

或与原阵列

arrayOfStuff.select{|item| arrayOfStuff.count(item) > 1}.uniq 
+0

我更喜欢你最后的解决方案比我的更多:) – lucapette

+1

@lucapette,你的一个更好,那么我的表现:) – fl00r

+0

是的,看起来很干净,优雅。再次做得好@ fl00r – omarArroum

1

减去阵列删除数组所有的匹配对象,:

["a", "a", "a"] - ["a"] 
#=> [] 

你可以在你的情况试试这个第一个。

见简单的测试:

[1,2,1] - [1] # => [2] 

所以,如果你要扫描的重复值,您可以尝试group_by(如lucapette管理,以更快的建议);-)

0

你可以做是这样的:

["UK01USV005", "NJ08APP516", "NJ08MHF001", "UK01USV505", "NY01MHF0006", "UK01USV525", "NJ08APP515", "NJ08MHF002"] && ["UK01USV005", "NJ08APP516", "NJ08MHF001", "UK01USV505", "NY01MHF0006", "UK01USV525", "UK01USV005", "NJ08APP515", "NJ08MHF002"] 

=> ["UK01USV005", "NJ08APP516", "NJ08MHF001", "UK01USV505", "NY01MHF0006", "UK01USV525", "UK01USV005", "NJ08APP515", "NJ08MHF002"] 

这是你在找什么?