如果..,则优化javascript函数代码..否则



我实现了一个逻辑,它迫使我基于不同的属性值创建许多条件。起初,我认为我可以用switch ... case语句重构它,但由于它不依赖于单个值,所以我不能采用这种解决方案。

如果是你,该如何优化、维护这些代码?上下文:我们在React组件中,所以也许我也可以使用useCallbackUseMemo

function navigateToNextStep() {
if (
user.lifecycle.stepCompany === 'todo' ||
user.lifecycle.stepCompany === 'progress'
) {
navigation.navigate(App.SETUP.COMPANY);
}
if (
user.lifecycle.stepIdentity === 'todo' ||
user.lifecycle.stepIdentity === 'progress'
) {
navigation.navigate(App.SETUP.IDENTITY);
}
if (user.lifecycle.stepFinalize === 'todo') {
navigation.navigate(App.SETUP.FINALIZE);
}
if (user.lifecycle.stepIdentity === 'awaiting_review') {
navigation.navigate(App.SETUP.MODAL.AWAITING_REVIEW);
}
if (user.lifecycle.stepIdentity === 'need_approval') {
navigation.navigate(App.SETUP.MODAL.APPROVAL_REQUIRED);
}
} 

如果您有相当复杂的If-else语句,请查看RulesEngine、

这是一组生成规则,每个规则都有一个条件和一个操作——简单地说,你可以把它看作一堆if-then语句。

也许在您的情况下,这是简化的最佳方式(但在大多数情况下,如果其他情况或切换情况足够的话(。

在这里你可以找到不同的js实现。以json规则引擎为例:

此示例演示了一个用于识别为微软工作并在圣诞节休假的员工的引擎。

const { Engine } = require('json-rules-engine')

/**
* Setup a new engine
*/
let engine = new Engine()
// define a rule for detecting the player has exceeded foul limits.  Foul out any player who:
// (has committed 5 fouls AND game is 40 minutes) OR (has committed 6 fouls AND game is 48 minutes)
engine.addRule({
conditions: {
any: [{
all: [{
fact: 'gameDuration',
operator: 'equal',
value: 40
}, {
fact: 'personalFoulCount',
operator: 'greaterThanInclusive',
value: 5
}]
}, {
all: [{
fact: 'gameDuration',
operator: 'equal',
value: 48
}, {
fact: 'personalFoulCount',
operator: 'greaterThanInclusive',
value: 6
}]
}]
},
event: {  // define the event to fire when the conditions evaluate truthy
type: 'fouledOut',
params: {
message: 'Player has fouled out!'
}
}
})
/**
* Define facts the engine will use to evaluate the conditions above.
* Facts may also be loaded asynchronously at runtime; see the advanced example below
*/
let facts = {
personalFoulCount: 6,
gameDuration: 40
}
// Run the engine to evaluate
engine
.run(facts)
.then(({ events }) => {
events.map(event => console.log(event.params.message))
})
/*
* Output:
*
* Player has fouled out!
*/

或者您可以自己编写一个基于Object的规则引擎的简单实现。

举个例子:

const rules = [{
rule: (user) => ['todo', 'progress'].includes(user.lifecycle.stepCompany),
action: () => console.log("App.SETUP.COMPANY")
},
{
rule: (user) => ['todo', 'progress'].includes(user.lifecycle.stepIdentity),
action: () => console.log("App.SETUP.IDENTITY")
}
]
const user = {
lifecycle: {
stepCompany: 'todo',
stepIdentity: 'progress'
}
}
rules.forEach(r => {
if (r.rule(user)) {
r.action()
}
})

最新更新