All*_*dog 11 ruby arrays unique
据我所知,结果
["a", "A"].uniq
Run Code Online (Sandbox Code Playgroud)
是
["a", "A"]
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如何制作["a","A"] .uniq给我["a"]或["A"]
Eri*_*c C 36
还有另一种方法可以做到这一点.您实际上可以将块传递给uniq
或uniq!
可用于评估每个元素的块.
["A", "a"].uniq { |elem| elem.downcase } #=> ["A"]
Run Code Online (Sandbox Code Playgroud)
要么
["A", "a"].uniq { |elem| elem.upcase } #=> ["A"]
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,一切都将不区分大小写,因此它将始终返回数组 ["A"]
Dan*_*man 16
只是首先使案例保持一致.
例如:
["a","A"].map{|i| i.downcase}.uniq
Run Code Online (Sandbox Code Playgroud)
编辑:如果像mikej建议的那样,返回的元素必须与原始数组中的元素完全相同,那么这将为您做到:
a.inject([]) { |result,h| result << h unless result.map{|i| i.downcase}.include?(h.downcase); result }
Run Code Online (Sandbox Code Playgroud)
Edit2解决方案哪个应该满足mikej :-)
downcased = []
a.inject([]) { |result,h|
unless downcased.include?(h.downcase);
result << h
downcased << h.downcase
end;
result}
Run Code Online (Sandbox Code Playgroud)
你可以在case-normalized(例如downcased)值和实际值之间构建一个映射(Hash),然后只取哈希值:
["a", "b", "A", "C"]\
.inject(Hash.new){ |h,element| h[element.downcase] = element ; h }\
.values
Run Code Online (Sandbox Code Playgroud)
选择给定单词的最后一次出现(不区分大小写):
["A", "b", "C"]
Run Code Online (Sandbox Code Playgroud)
如果你想要第一次出现:
["a", "b", "A", "C"]\
.inject(Hash.new){ |h,element| h[element.downcase] = element unless h[element.downcase] ; h }\
.values
Run Code Online (Sandbox Code Playgroud)
["a", "A"].map{|x| x.downcase}.uniq
=> ["a"]
Run Code Online (Sandbox Code Playgroud)
或者
["a", "A"].map{|x| x.upcase}.uniq
=> ["A"]
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 ActiveSupport,则可以使用uniq_by。它不影响最终输出的情况。
['A','a'].uniq_by(&:downcase) # => ['A']
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7388 次 |
最近记录: |