我发现自己经常想根据一组条件查找某些东西(通常是函数或构造函数)。在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 相比, condition 值已基本上替换了字符串键,而 Animal 构造函数仍是值
我正在尝试遵循open-closed principle。在上面的示例中,getAnimal()可以通过向查询中添加另一个项目来支持新的动物,而这不需要对函数本身进行任何更改。