Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript如果还有其他选择_Javascript_Oop_If Statement - Fatal编程技术网

Javascript如果还有其他选择

Javascript如果还有其他选择,javascript,oop,if-statement,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.ha

我有以下代码

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多起其他事件。我的问题是,这是否是业绩不佳的原因,是否有其他方法可以实现这一点

更新

另一个问题


有人能给我解释一下如何为这段代码实现基于地图的条件化吗?你可以使用switch语句
您可以尝试使用Swtich case() 我不知道这对你来说是否有效

switch(probs){
      case "(props.hasOwnProperty('c'))"
           return 'c';
      case "(props.hasOwnProperty('d'))"
           return 'd'; }
最后应该是这个样子

我的问题是,这是否是业绩不佳的原因

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

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

var propsList = Object.keys(props);

if (propsList.indexOf("a") > 0 && propsList.indexOf("b") > 0){
    return "ab"; 
}
如果希望避免if语句,可以使用for循环和包含所有属性的数组

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!!!"); 
}
var add=函数(道具){
var listKeys=[“ab”、“c”、“d”];//属性列表
var objectKeys=Object.keys(道具);
for(var i=0,len=listKeys.length;i
您可以使用switch语句,但更复杂的逻辑,如
&&
开始变得更复杂(它们实际上是为快速一对一比较而设计的)。如果你想要更复杂的逻辑,我会坚持你所拥有的。这在技术上是最慢的,但如果所有其他方法都非常复杂,那么实现性能提升就不值得了。

我尝试了一种更通用的解决方案,如下所示:

函数MyFunc(){
//检查“obj”中是否包含所有“searchedProps[]”属性;
//如果没有找到一个属性,它将返回false;
//如果找到所有属性,则返回true;
函数属性(obj、searchedProps){
对于(var i=0;i

请在控制台中检查结果。
有一个开关盒。您可以尝试检查以下链接@Esso感谢链接。你能帮我实现基于地图的条件化吗:)
switch(true){case x==y:alert(1);break;case z==123:alert(1);break;}