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))