逻辑 OR/AND Handlebars.JS 助手,多个参数,始终检查第一个

Logical OR/AND Handlebars.JS Helper, Multiple Arguments, First One Always Being Checked

建议将以下内容作为逻辑 AND/OR 多参数​​ Handlebars.JS 助手:

Handlebars.registerHelper({
    and: function () {
        return Array.prototype.slice.call(arguments).every(Boolean);
    },
    or: function () {
        return Array.prototype.slice.call(arguments).some(Boolean);
    }
});

Handlebars.js Else If

这对我不起作用,因为我需要将其命名为

{{#if (or questionType 'STARTTIME' 'ENDTIME') }}

{{#if (or questionType 'STARTTIME' 'ENDTIME' 'ARGUMENT3' 'ARGUMENT4') }}

换句话说,

  1. 我的 AND/OR、
  2. 支持多个参数
  3. T第一个参数始终是我要检查的内容,例如

    return (questionType == arg1 || questionType == arg2 || questionType == arg3 ...)

换句话说,我不能像这样写一个愚蠢的 2-param or(..) / and(..),

Handlebars.registerHelper('or', function(a, b, c) {
    if(a == b || a == c)
        return true;
    else
        return false;
});

它应该是多参数的,第一个总是被选中。有什么想法吗?

首先:您原来的 or 助手将无法工作。 Handlebars 在调用 helper 时传递一个额外的元对象作为最终参数。例如,在模板中使用您的 or 助手作为 (or false false) 会导致使用以下 arguments 对象执行助手函数:

{
    0: false,
    1: false,
    2: {
        "name": "or",
        "hash": {...},
        "data": {...}
    },
    length: 3
}

3 处的对象的存在将在 Boolean 转换中评估为 true 并导致您的助手 return true 尽管调用站点仅传递 false 个值。

为了使助手按预期工作,我们需要在 slicing 我们的 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]);

我们的助手现在按我们的预期工作;但我建议您重命名它,因为它不是 "or" 操作,而是 "in".