Javascript:嵌套返回语句,返回内部返回

Posted

技术标签:

【中文标题】Javascript:嵌套返回语句,返回内部返回【英文标题】:Java Script: Nested Return Statement, return inside Return 【发布时间】:2016-10-06 03:23:26 【问题描述】:

在我之前的一个问题js: Multiple return in Ternary Operator 中,我询问了有关使用三元运算符返回多个参数的问题。但是现在参数IsActveUser boolean(true|false)标志已经修改为integer(0|1|2|3)标志

以前它只有两种状态,

True - Valid User
False - InValid User

现在它有四种状态,

0 - InValid User
1 - Valid User
2 - Future User
3 - Expired User

所以以前,我编码过,

var data = userInfo.map(function (element) 
    return 
        'LastName': Capitalizefirstletter(element[1]),
        'FirstName': Capitalizefirstletter(element[2]),
        'UserName': element[3],
        'IsActiveUser': ~element[9].search("Valid") ? "True": "False" // really a string?
    ;
)

现在我必须像这样检查四个状态标志

var data = userInfo.map(function (item) 
    if (item[9].search("title = \"Expired\"")) 
        return 
            'LastName': Capitalizefirstletter(item[1]),
            'FirstName': Capitalizefirstletter(item[2]),
            'UserName': item[3],
            'UserStatusFlag': 3 // flag should be 3 in this case
        ;
    
    else if (item[9].search("title = \"Valid\"")) 
        return 
            'LastName': Capitalizefirstletter(item[1]),
            'FirstName': Capitalizefirstletter(item[2]),
            'UserName': item[3],
            'UserStatusFlag': 1 // flag should be 1 in this case
        ;
    
    else if (item[9].search("title = \"Invalid\"")) 
        return 
            'LastName': Capitalizefirstletter(item[1]),
            'FirstName': Capitalizefirstletter(item[2]),
            'UserName': item[3],
            'UserStatusFlag': 0 // flag should be 0 in this case
        ;
    
    else if (item[9].search("title = \"Future\"")) 
        return 
            'LastName': Capitalizefirstletter(item[1]),
            'FirstName': Capitalizefirstletter(item[2]),
            'UserName': item[3],
            'UserStatusFlag': 2 // flag should be 2 in this case
        ;
    
);

但这在 Knockout JS 中没有按预期工作。

我应该使用这样的东西吗,否则 - 如果检查内部返回语句

var data = userInfo.map(function (element) 
    return 
        'LastName': Capitalizefirstletter(element[1]),
        'FirstName': Capitalizefirstletter(element[2]),
        'UserName': element[3],
        'UserStatusFlag': if(~element[9].search("Valid")) 1
                                    else if (~element[9].search("InValid")) 0
                                    else if (~element[9].search("Future")) 2
                                    else if (~element[9].search("Expired")) 3
    ;
)

任何建议都会有所帮助。

【问题讨论】:

为什么不把它变成一个带有返回值的简单开关的函数调用呢? 也许你可以添加一些element的例子? 究竟如何它没有按预期工作? item[9] 的示例值是什么?是item[9] 还是element[9] 【参考方案1】:

进行函数调用,使用 switch 语句

function getCode (item) 
    switch (item) 
        case "InValid User" : 
            return 0;
        case "Valid User" :
            return 1;
        case "Future User" :
            return 2;
        case "Expired User" :
            return 3;
    

并在构建对象时调用它

var data = userInfo.map(function (element) 
    return 
        'LastName': Capitalizefirstletter(element[1]),
        'FirstName': Capitalizefirstletter(element[2]),
        'UserName': element[3],
        'UserStatusFlag': getCode(element[9])
    ;
);

或者你可以使用一个对象而不是一个开关

var states = 
  "InValid User" : 0,
  "Valid User" : 1,
  "Future User" : 2,
  "Expired User" : 3
;

var data = userInfo.map(function (element) 
    return 
        'LastName': Capitalizefirstletter(element[1]),
        'FirstName': Capitalizefirstletter(element[2]),
        'UserName': element[3],
        'UserStatusFlag': states[element[9]]
    ;
);

【讨论】:

【参考方案2】:

我讨厌 switchif 阻止这个。 object 映射效果更好:

var USER_LOOKUP = 
    "InValid User" : 0,
    "Valid User" : 1,
    "Future User" : 2,
    "Expired User" : 3
;

var data = userInfo.map(function (element) 
    return 
        'LastName': Capitalizefirstletter(element[1]),
        'FirstName': Capitalizefirstletter(element[2]),
        'UserName': element[3],
        'UserStatusFlag': USER_LOOKUP[element[9]]
    ;
);

【讨论】:

你在用USER_LOOKUP[~element[9]]做什么?查看问题,它看起来像 element[9] 包含一个字符串,您还想获取一个字符串以用作 USER_LOOKUP 的键。 愚蠢的复制和粘贴。固定的。对不起!【参考方案3】:

javascript 中,if 不是表达式,因此它没有返回值。但是你可以使用ternary operator(在 JavaScript 中实际称为conditional operator

我认为您的代码无法正常工作的原因是 String.prototype.search 返回找到的字符串的索引,如果未找到该字符串,则返回 -1。根据您的数据,您可能不需要使用搜索,而可以直接比较刺痛。所以不是

item[9].search("title = \"Valid\"")

你必须使用

item[9].search("title = \"Valid\"") > -1

或者您可以执行您在第二个示例中所做的操作并使用波浪号(如 here 所述)

~item[9].search("title = \"Valid\"")

所以你可以使用:

item[9].search('title = "Expired"') > -1 ? 3 :
item[9].search('title = "Valid"')   > -1 ? 1 :
item[9].search('title = "Invalid"') > -1 ? 0 :
item[9].search('title = "Future"')  > -1 ? 2 :
(()=>  throw Error(item[9] + ' is not a valid state' ) )()

当然,开关或地图也可以工作。

【讨论】:

这真的很棒!有效。考虑到代码效率和代码行问题,我会这样做。 执行多个ifs 真的比一个对象查找更有效吗? 我不知道与多个ifs 相比,对象查找的成本有多高。但我不确定是否有针对此问题使用对象查找的有效解决方案。在问题中使用了String.prototype.search,根据元素[9] 中的数据,这可能是必要的。

以上是关于Javascript:嵌套返回语句,返回内部返回的主要内容,如果未能解决你的问题,请参考以下文章

Javascript,while循环返回

JavaScript条件语句-5

JavaScript的函数

嵌套 if 语句返回语句句柄未执行错误

从Javascript中的嵌套函数返回值[重复]

从Javascript中的嵌套函数返回值[重复]