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