2015-07-23 2 views
3

я следующий кодJavascript, если в другом месте альтернативы

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 else, если вхождения. Мой вопрос будет ли это быть причиной плохой работы, Есть ли альтернатива Approch для достижения этой

DEMO

UPDATE

Другой вопрос

Может кто-то пожалуйста, объясните мне, как реализовать на основе базы данных для этого кода

+0

Там есть переключатель случай. –

+0

вы можете попытаться проверить по следующей ссылке http://stackoverflow.com/questions/8304632/alternative-to-if-else-if-else-if-else-if-etc-in-javascript – nicksterwolf91

+0

@ Esso Спасибо за ссылку.Не могли бы вы помочь мне реализовать настройку на основе карты для этого :) –

ответ

1

Вы можете использовать операторы switch http://www.w3schools.com/js/js_switch.asp

+2

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

указывает на Майкла. Благодарю. –

-1

Вы можете попытаться использовать корпус Swtich (http://www.w3schools.com/js/js_switch.asp) Не знаю, будет ли это работать в вашем случае.

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

должен выглядеть в конце

1

Мой вопрос будет ли это быть причиной плохой работы

Ну во всех случаях логика показывает, что вам нужно сделать некоторые перед возвратом имени этих свойств. Итак, если вы заботитесь о производительности, вам нужно уменьшить время каждой проверки.

Что вы можете сделать, это получить список props свойств вместо делать hasOwnProperty в каждом случае заявления, и использовать этот список, чтобы сделать чек с indexOf.

var propsList = Object.keys(props); 

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

С этим, если вы хотите избежать, если заявления, вы могли бы использовать для петли и массив, который будет содержать все свойства

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

Вы можете использовать оператор коммутатора, но с более сложной логикой, такие как && начинает усложняться (они действительно предназначены для простого сравнения один к одному). Я бы придерживался того, что у вас есть, если вы хотите эту более сложную логику. Это технически самый медленный, но если все другие способы очень сложны для реализации усиления производительности, это не будет стоить того.

1

Я экспериментировал более общее решение следующим образом:

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.

Смежные вопросы