Чтобы ответить на первую часть вашего вопроса, где i[0]
или i[1]
возвращает одну букву вместо элемента, давайте рассмотрим ваш код:
@x.each do |i|
Здесь i
- элемент. Таким образом, в первой итерации i
является «американским». Поэтому, когда вы вызываете i[0]
, он возвращает первый символ строки, который является a , а i[1]
возвращает m , и обе их длины равны 1 .
Вместо этого вы должны изменить свой код следующим образом:
%ul.list-inline
- @x.each_cons(2) do |current, next|
- if current.length < next.length
%li
%i{:class=>"fas fa-#{current} fa-2x"}
%span.f6 #{current}
- else
%li
%i{:class=>"far fa-#{next} fa-2x"}
%span.f6 #{next}
Что касается второй части вашего вопроса, вы определили @x
как:
@x = ["american", "assistive", "audio", "blind", "braille", "closed-captioning", "closed-captioning", "deaf", "low", "phone", "question-circle", "question-circle", "sign", "tty", "universal", "wheelchair"]
Чтобы получить уникальные элементы:
@x_uniq = @x.uniq
Чтобы получить дубликаты:
@x_dup = @x.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.select{ |k,v| v > 1 }.keys
, который возвращает
["closed-captioning", "question-circle"]
По моему мнению, использование второго способа фильтрации данных и его использование - лучшее решение, чем сравнение элементов с их длинами.
Надеюсь, это помогло.