Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 对于传入类型、遍历一些条件和返回对象,什么样的设计模式比较好_Javascript_Design Patterns - Fatal编程技术网

Javascript 对于传入类型、遍历一些条件和返回对象,什么样的设计模式比较好

Javascript 对于传入类型、遍历一些条件和返回对象,什么样的设计模式比较好,javascript,design-patterns,Javascript,Design Patterns,我有一堆条件语句,就像上面的一样,它们是在不同案例操作失败时执行的。大多数操作具有相同的if/elseIf结构,但有些操作具有附加的elseIf或一个或多个的减法 const someFailedAction = (caseIds, growlMessages) => { if (caseIds.length > 1) { toastr.error(growlMessages[0], errorToastrOptions); } else if (i

我有一堆条件语句,就像上面的一样,它们是在不同案例操作失败时执行的。大多数操作具有相同的if/elseIf结构,但有些操作具有附加的elseIf或一个或多个的减法

const someFailedAction = (caseIds, growlMessages) => {

    if (caseIds.length > 1) {
        toastr.error(growlMessages[0], errorToastrOptions);
    } else if (isCaseDetailsDisplayed) {
        toastr.error(growlMessages[1], errorToastrOptions);
    } else if (errorParts.fieldIds.length === 0) {
        toastr.error(growlMessages[2], errorToastrOptions);
    } else {
        toastr.error(growlMessages[3], errorToastrOptions);
    }
}

我想知道是否有一种很好的设计模式,我可以在没有长嵌套重复的switch语句的情况下传入消息的类型和数组。

只需使用布尔数组并找到成功的索引:

const SomeOtherFailedAction = (caseIds, growlMessages) => {

    if (caseIds.length > 1) {
        toastr.error(growlMessages[0], errorToastrOptions);
    } else if (isCaseDetailsDisplayed) {
        toastr.error(growlMessages[1], errorToastrOptions);
    } else {
        toastr.error(growlMessages[2], errorToastrOptions);
    }

}
或者,您可以存储一个可重用的函数数组,逐个执行并返回函数返回true的第一个索引:

const i = [
 caseIds.length > 1,
 isCaseDetailsDisplayed,
 errorParts.fieldIds.length === 0,
 true
].indexOf(true);

toastr.error(growlMessages[i], errorToastrOptions)

Jonas的解决方案非常有效。请注意,您可以通过设置默认索引来干燥现有内容,并且只在条件中覆盖它。然后在最后调用函数一次

const tests = [
 () => caseIds.length > 1,
 () => isCaseDetailsDisplayed,
 () => errorParts.fieldIds.length === 0,
 () => true
]

const i = tests.findIndex(f => f());

toastr.error(growlMessages[i], errorToastrOptions)

在您的例子中,我看到在
someFailedAction
函数中,您在每个条件下都有几乎相同的行:
toastr.error(growlMessages[%index%],options)
someFailedAction
的末尾调用
error
不会更好,但是在每种情况下,您都为
growlMessages
指定了
索引
IsCaseDetails显示在哪里
errorParts
来自哪里?感谢您的快速回复。我正在重构一堆代码,当您已经看到一个解决方案(尽管是一个糟糕的解决方案)时,有时很难找到更好的解决方案
const someFailedAction = (caseIds, growlMessages) => {

    let idx = 3// replaces final `else` and is default

    if (caseIds.length > 1) {
        idx=0;        
    } else if (isCaseDetailsDisplayed) {
        idx = 1;        
    } else if (errorParts.fieldIds.length === 0) {
        idx= 2;        
    }// last `else` removed since already have a default

    toastr.error(growlMessages[idx], errorToastrOptions);
}