Javascript if other options

I have the following code

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();

      

When executed lol.func({fName: 'add', props: {a: 'a', b: 'b'}});

, it should return the correct response from internal if else

functions add

. But there can be more than 20 else if occurrences. My question is if this would be the reason for poor performance, is there an alternative approach to achieve this

DEMO

UPDATE

Another question

Can someone please explain to me how to implement the map based plotting for this code.

+3


source to share


5 answers


You can use a switch statement, but more complex logic like &&

it starts to get complicated (they are really meant for a simple one-to-one comparison). I would stick with what you have if you want this more complex logic. This is technically the slowest, but if all the other ways are very difficult to implement performance gain, it won't be worth it.



+2


source


you can use switch statements http://www.w3schools.com/js/js_switch.asp



+1


source


My question is whether this will be the reason for poor performance

In all cases, the logic shows that you need to do some checking before returning the name of these properties. Therefore, if you want performance, you need to reduce the time of each check.

What you can do is get the list of properties props

instead of being executed hasOwnProperty

in each if statement and use the list to test with indexOf

.

var propsList = Object.keys(props);

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

      

With this, if you want to avoid if statements, you can use a for loop and an array that will contain all the properties

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!!!"); 
}

      

+1


source


I experimented with a more general solution like this:

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);
      

Please check the result in console.
      

Run codeHide result


+1


source


You can try using the Swtich case ( http://www.w3schools.com/js/js_switch.asp ) Don't know if this will work in your case.

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

      

should look like this

-1


source







All Articles