Java Script:嵌套的Return语句,返回Return

时间:2016-06-06 13:28:51

标签: javascript if-statement knockout.js return

在我之前的一个问题js: Multiple return in Ternary Operator中,我询问过使用三元运算符返回多个参数。但现在参数 IsActveUser boolean(true | false)标志已被修改为整数(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}
    };
})

任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:4)

进行函数调用,使用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]]
    };
});

答案 1 :(得分:4)

我讨厌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]]
    };
)};

答案 2 :(得分:2)

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

我认为你的代码不起作用的原因是String.prototype.search返回找到的字符串的索引,如果找不到字符串,则返回-1。根据您的数据,您可能不需要使用搜索,只需直接比较sting即可。而不是

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' ) })()

当然,开关或地图也可能有用。