2017-02-15 22 views
1

Я использую Ruby 2.4. Как получить уникальные элементы, без учета регистра, из массива, но с учетом элементов nil? Я thougth это решениеКак получить уникальные элементы, не учитывающие регистр в Ruby, и учет элементов nil?

data.map{|i| i || i.downcase}.uniq 

, но даже после того, как все мое обучение я все еще получаю ошибку

NoMethodError: undefined method `downcase' for nil:NilClass 

, когда один из элементов в массиве Teh равна нулю.

ответ

1

Ваш вопрос говорит, что вы хотите уникальные элементы регистронезависимом образом. @ Ответ Глоко делает это.

Если вы хотите, чтобы все элементы были преобразованы в нижний регистр (или в верхний регистр), это отличается от того, что вы просили.

data.map(&:downcase).uniq будет работать, если все элементы data являются downcase в состоянии. В противном случае вы получите NoMethodError s.

Вы можете устранить непредоставление downcase способных элементов, как это:

data.select{|item| item.respond_to? :downcase}.map(&:downcase).uniq 

хотя, если только не- downcase способных элементов nil s, вы можете устранить те просто compact первый ИНГ массива:

data.compact.map(&:downcase).uniq 

Отметьте, что ary.map(&:foo) является сокращением на ary.map {|item| item.foo}.

2

Для этого вам нужно просто изменить || на номер &&. || ничего не делает, когда элемент равен нулю.

В качестве альтернативы вы можете использовать &., чтобы сделать его немного красивее. Кроме того, вы можете сократить все это, пройдя блок до uniq.

data.uniq { |datum| datum&.downcase } 

Если результаты также должны быть downcased, в этом случае вам еще нужна карта:

data.map { |datum| datum&.downcase }.uniq 
+0

Это исключает исключение, которое я получал, но оно не возвращает массив элементов с более низким положением. Я все еще вижу элементы в их первоначальной форме. –

+0

Да, да? Какие тестовые данные вы используете? Это правда, что это не устраняет ниль, хотя вы тоже этого хотели? Если вы хотите удалить nils, вы можете просто добавить '.compact' ко всему предмету – Glyoko

+0

Нет, это сравнивает регистр без учета регистра для процесса' uniq', но фактически не модифицирует элементы. '['A', 'a'] .uniq (&: downcase)' может возвращать '['A']', даже если он превратил эту строку в '' a'' для целей сравнения. –