Javascript if else alternatives

时间:2015-07-23 08:02:11

标签: javascript oop if-statement

我有以下代码

function MyFunc() {

    var add = function (props) {

      if (props.hasOwnProperty('a') && props.hasOwnProperty('b')) {
        return 'ab';
      } else if (props.hasOwnProperty('c')) {
        return 'c';
      } else if (props.hasOwnProperty('d')) {
        return 'd';
      } else {
        throw new Error("Doomed!!!");
      }

    };

    var div = function () {
        return "Hello from div";
    };

    var methods = {
        add: add,
        div: div
    };

    var funcCall = function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }

        return methods[obj.fName](obj.props);
    };

    return {
        func: function (obj) {
            return funcCall(obj);
        }
    };

}

var lol = new MyFunc();

运行lol.func({fName: 'add', props: {a: 'a', b: 'b'}});时,它应该从add函数内部if else语句返回正确的响应。但如果发生,可能会有超过20个。我的问题是,这将是表现不佳的原因,是否有任何替代方案来实现这个

DEMO

更新

另一个问题

有人可以解释一下如何为此代码实现基于地图的条件

5 个答案:

答案 0 :(得分:2)

您可以使用switch语句,但更复杂的逻辑(例如&&)开始变得更复杂(它们实际上是为快速一对一比较而设计的)。如果你想要更复杂的逻辑,我会坚持你所拥有的。从技术上讲,它是最慢的,但如果所有其他方法都非常复杂,那么性能的提升将是不值得的。

答案 1 :(得分:1)

您可以使用switch语句 http://www.w3schools.com/js/js_switch.asp

答案 2 :(得分:1)

  

我的问题是这是性能不佳的原因

在所有情况下,逻辑显示您需要在返回这些属性的名称之前进行一些检查。 因此,如果您关心表现,则需要减少每次检查的时间。

您可以做的是检索props属性列表,而不是在每个if语句中执行hasOwnProperty,并使用列表与indexOf进行检查。

var propsList = Object.keys(props);

if (propsList.indexOf("a") > 0 && propsList.indexOf("b") > 0){
    return "ab"; 
}

如果您想要避免if语句,可以使用for循环和包含所有属性的Array

var add = function (props) {
    var listKeys = ["ab", "c", "d"]; // List of the properties

    var objectKeys = Object.keys(props);
    for (var i = 0, len = listKeys.length; i < len ; i++){
        var listProps = listKeys[i].split("");

        var ok = true;
        for (var j = 0, len2 = listProps.length; j < len2 ; j++){
            if (objectKeys.indexOf(listProps[j]) < 0){
                ok = false;
                break;
            }
        }
        if (ok){
           return listKeys[i];
        }
    }

    throw new Error("Doomed!!!"); 
}

答案 3 :(得分:1)

我已经尝试了一个更通用的解决方案如下:

$ cat ~/.aws/credentials
[default]
aws_access_key_id = blablabla
aws_secret_access_key = blablabla
region = us-west-2
function MyFunc() {

    // Check if all 'searchedProps[]' properties are contained in 'obj';
    // If one property is not found it will return false;
    // If all properties are found it will return true;
    function hasProperties(obj, searchedProps) {
        for (var i = 0; i < searchedProps.length; i++) {
            if (!obj.hasOwnProperty(searchedProps[i])) {
                return false;
            }
        }
        return true;
    }

    var add = function (props) {

        var options = [
            {
                properties: ["a", "b"],
                result: "ab"
            },
            {
                properties: ["c"],
                result: "c"
            },
            {
                properties: ["d"],
                result: "d"
            }];

        for (var i = 0; i < options.length; i++) {
            if (hasProperties(props, options[i].properties)) {
                return options[i].result;
            }
        }

        throw new Error("Doomed!!!");

    };

    var div = function () {
        return "Hello from div";
    };

    var methods = {
        add: add,
        div: div
    };

    var funcCall = function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }

        return methods[obj.fName](obj.props);
    };

    return {
        func: function (obj) {
            return funcCall(obj);
        }
    };

}

var lol = new MyFunc();

var result = lol.func({ fName: 'add', props: { a: 'a', b: 'b' } });

console.log(result);

答案 4 :(得分:-1)

您可以尝试使用Swtich案例(http://www.w3schools.com/js/js_switch.asp) 不知道这是否适用于你的情况。

switch(probs){
      case "(props.hasOwnProperty('c'))"
           return 'c';
      case "(props.hasOwnProperty('d'))"
           return 'd'; }

最后应该是这样的