Первый: ваш оригинальный or
помощник не будет работать. Handlebars передает дополнительный мета-объект в качестве последнего аргумента при вызове помощника. Например, использование вашего or
помощника в шаблоне в качестве (or false false)
приводит к выполнению вспомогательной функции со следующим объектом arguments
:
{
0: false,
1: false,
2: {
"name": "or",
"hash": {...},
"data": {...}
},
length: 3
}
Наличие этого объекта в 3
оценивается как true
в преобразовании Boolean
и заставит вашего помощника вернуть true
, несмотря на то, что сайт вызова передает только false
значения.
Чтобы помощник работал должным образом, нам нужно исключить последний аргумент, когда нарезает наш arguments
объект. (К сведению: цель slice
- преобразовать объект типа arguments
в виде массива в массив, чтобы мы могли вызывать для него методы Array.prototype, например .some
.) Для этого мы обновляем наш or
Помощник должен быть:
return Array.prototype.slice.call(arguments, 0, -1).some(Boolean);
Теперь мы можем обратиться к проблеме сравнения нашего первого аргумента с остальными. Мы также можем обновить наш .slice
вызов, чтобы исключить и первый аргумент: .slice.call(arguments, 1, -1)
. Тогда нам нужно только сравнить каждый элемент в срезе с первым аргументом. Наш помощник становится:
return Array.prototype.slice.call(arguments, 1, -1).some(arg => arg === arguments[0]);
Наш помощник теперь работает так, как нам нужно; но я призываю вас переименовать его, поскольку это не операция «или», а «in».