Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将Array.prototype.every()的回调更改为Arrow函数_Javascript - Fatal编程技术网

Javascript 将Array.prototype.every()的回调更改为Arrow函数

Javascript 将Array.prototype.every()的回调更改为Arrow函数,javascript,Javascript,我在一个非常简单的规则引擎中工作,它评估一系列条件,包括一个操作和一个期望值。只有当数组中的所有条件都为真时,这些规则才有效 我的代码(实际上,它目前可以工作)看起来类似于以下内容,我只是简化了函数体,使问题更加简洁: const isA = (p1, p2, p3) => { return false; // Simplified function body, real thing has some logic }; const isB = (p1, p2, p3) =>

我在一个非常简单的规则引擎中工作,它评估一系列条件,包括一个操作和一个期望值。只有当数组中的所有条件都为真时,这些规则才有效

我的代码(实际上,它目前可以工作)看起来类似于以下内容,我只是简化了函数体,使问题更加简洁:

const isA = (p1, p2, p3) => {
    return false; // Simplified function body, real thing has some logic
};

const isB = (p1, p2, p3) => {
    return false;
};

const getC = (p1, p2, p3) => {
    return 0;
};

const getD = (p1, p2, p3) => {
    return "string";
};

const rule = {
    conditions: [
        { operation: isA, expectedValue: false },
        { operation: isB, expectedValue: false },
        { operation: getC, expectedValue: 0 },
        { operation: getD, expectedValue: "string" }
    ]
};

function isConditionMet(condition) {
    return (
        condition.operation(this.p1, this.p2, this.p3) ===
        condition.expectedValue
    );
}

export const areRuleConditionsMet = (p1, p2, p3) => {
    return rule.conditions.every(isConditionMet, { p1, p2, p3 });
}
基本上,
p1
p2
p3
在操作中用于生成实际值,与预期值进行比较,以确定是否满足每个条件,如果满足每个条件,则导出的函数将返回
true


我想做的是更改我的代码,以便
isConditionMet
可以成为一个箭头函数,以遵循代码其余部分的结构,同时避免使用
this
,但我的问题是,显然,我依赖
Array.prototype.each()的
thisArg
areRuleConditionsMet的参数传播到每个操作有什么想法吗?

您只需将匿名箭头函数传递给
数组#every()
,并使
isConditionMet()
接受另一个包含
p1
p2
p3
的参数

const isConditionMet = (condition, params) => (
        condition.operation(params.p1, params.p2, params.p3) ===
        condition.expectedValue
);

export const areRuleConditionsMet = (p1, p2, p3) => {
    return rule.conditions.every(condition => isConditionMet(condition, { p1, p2, p3 }));
}

我经常喜欢使用创建函数的函数(也称为currying):

然后你可以像这样使用它:

rule.conditions.every(isConditionMet(p1, p2, p3))

“有什么想法吗?”保持原样。并非所有的东西都必须是箭头函数。或者,如果
isConditionMet
是固定的(无论如何都不能更改),则在
areRuleConditionsMet
中定义它,并直接引用
p1
p2
p3
返回规则.conditions.every(c=>c.operation(p1,p2,p3)==c.expectedValue)
@epascarello asker希望避免使用
,而不是找到另一种方法将其与箭头功能结合使用。这是一个很好的观点@Klaycon,我使用了您的方法,并按照我的预期工作。我还将isConditionMet更改为常量+
=>
,这就是我希望我的代码在开始时的样子。@LucianoM.L。对,忘了这是我们的目标了,哈哈。我编辑了答案,以符合最初的目标,只是为了子孙后代。
rule.conditions.every(isConditionMet(p1, p2, p3))