В духе оригинального вопроса:
Я бы хотел сравнить два массива ... идеально, эффективно.
blockquote>Я выполнял тесты производительности на некоторые из более простых предложений, предложенных здесь, со следующими результатами (быстрый до медленного):
, а (67%) - Tim Down
var i = a1.length; while (i--) { if (a1[i] !== a2[i]) return false; } return true
каждый (69 %) пользователем2782196
a1.every((v,i)=> v === a2[i]);
уменьшить (74%) с помощью DEI
a1.reduce((a, b) => a && a2.includes(b), true);
join & amp; toString (78%) Gaizka Allende & amp; vivek
a1.join('') === a2.join(''); a1.toString() === a2.toString();
half toString (90%) от Victor Palomo
a1 == a2.toString();
stringify (100%) на radtek
JSON.stringify(a1) === JSON.stringify(a2);
Обратите внимание, что приведенные ниже примеры предполагают, что массивы отсортированы, одномерные массивы. Сравнение
.length
было удалено для общего теста (добавьтеa1.length === a2.length
к любому из предложений, и вы получите повышение производительности на 10%). Выберите любые решения, которые лучше всего подходят для вас, зная скорость и ограничение каждого из них.Несвязанное примечание: интересно видеть, как люди получают все триггер-счастливые Джон Уэйнс при снижении голосов на вполне законные ответы на этот вопрос.
blockquote>
Можно использовать массив или хешировать с этой целью (в environment.rb):
OPTIONS = ['one', 'two', 'three']
OPTIONS = {:one => 1, :two => 2, :three => 3}
или альтернативно класс перечисления, который позволяет Вам перечислять по Вашим константам, а также ключам, раньше связывал их:
class Enumeration
def Enumeration.add_item(key,value)
@hash ||= {}
@hash[key]=value
end
def Enumeration.const_missing(key)
@hash[key]
end
def Enumeration.each
@hash.each {|key,value| yield(key,value)}
end
def Enumeration.values
@hash.values || []
end
def Enumeration.keys
@hash.keys || []
end
def Enumeration.[](key)
@hash[key]
end
end
, из которого можно тогда произойти:
class Values < Enumeration
self.add_item(:RED, '#f00')
self.add_item(:GREEN, '#0f0')
self.add_item(:BLUE, '#00f')
end
и использование как это:
Values::RED => '#f00'
Values::GREEN => '#0f0'
Values::BLUE => '#00f'
Values.keys => [:RED, :GREEN, :BLUE]
Values.values => ['#f00', '#0f0', '#00f']
Я поместил их непосредственно в образцовый класс, как так:
class MyClass < ActiveRecord::Base
ACTIVE_STATUS = "active"
INACTIVE_STATUS = "inactive"
PENDING_STATUS = "pending"
end
Затем при использовании модели от другого класса, я ссылаюсь на константы
@model.status = MyClass::ACTIVE_STATUS
@model.save
Если это управляет поведением модели, то константы должны быть частью модели:
class Model < ActiveRecord::Base
ONE = 1
TWO = 2
validates_inclusion_of :value, :in => [ONE, TWO]
end
Это позволит Вам использовать встроенную функциональность направляющих:
>> m=Model.new
=> #<Model id: nil, value: nil, created_at: nil, updated_at: nil>
>> m.valid?
=> false
>> m.value = 1
=> 1
>> m.valid?
=> true
, С другой стороны, если Ваши перечисления поддержки БД, то можно использовать что-то как Перечислимый плагин Столбца .
Можно также использовать его в рамках модели в хеше как это:
class MyModel
SOME_ATTR_OPTIONS = {
:first_option => 1,
:second_option => 2,
:third_option => 3
}
end
И использование это как это:
if x == MyModel::SOME_ATTR_OPTIONS[:first_option]
do this
end