Мне часто хочется что-то искать - часто функцию или конструктор - основываясь на ряде условий. Есть ли краткий способ сделать это в JavaScript? Даже если есть более лаконичный способ, есть ли лучший подход, когда я обнаруживаю, что достигаю этой схемы?
Это просто, когда нам просто нужно сравнить со строками или числами:
const getAnimal = type => {
const lookup = {
'cat': Cat,
'dog': Dog,
}
return new lookup[type](); // e.g. type = 'cat'
}
... но когда мне нужна более сложная логика, ключи поиска должны быть функциями. Например:
const animalFactory = traits => {
const lookup = [
// format: [condition, Animal]
// condition: returns true / false
// Animal: constructor
[likesWarmBeds, Cat],
[isIndifferent, Dog],
];
for (let [hasTraits, Animal] of lookup) {
if (hasTraits(criteria)) {
return Animal;
}
}
}
const getAnimal = (traits) => {
const Animal = animalFactory(traits);
return new Animal(traits);
}
По сравнению с lookup в более простом примере значения условие по существу заменили строковые ключи, а конструкторы Animal по-прежнему являются значениями.
Я пытаюсь следовать принципу открытый-закрытый . В приведенном выше примере getAnimal () может поддерживать новых животных, просто добавляя другой элемент в поиск, и это не потребует никаких изменений в самой функции.