如何使数组不区分大小写

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

还有另一种方法可以做到这一点.您实际上可以将块传递给uniquniq!可用于评估每个元素的块.

["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"]

  • 很好的答案.请注意,稍微短一些的变化是"["A","a"].uniq(&:downcase)`. (9认同)

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)


Luc*_*caM 7

你可以在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)


Cod*_*eef 5

["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)


hla*_*les 5

如果您使用的是 ActiveSupport,则可以使用uniq_by。它不影响最终输出的情况。

['A','a'].uniq_by(&:downcase) # => ['A']
Run Code Online (Sandbox Code Playgroud)