Таблица поиска / карта с условными обозначениями в качестве ключей? - PullRequest
0 голосов
/ 04 ноября 2018

Мне часто хочется что-то искать - часто функцию или конструктор - основываясь на ряде условий. Есть ли краткий способ сделать это в 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 () может поддерживать новых животных, просто добавляя другой элемент в поиск, и это не потребует никаких изменений в самой функции.

...