我有以下代码
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个。我的问题是,这将是表现不佳的原因,是否有任何替代方案来实现这个
更新
另一个问题
有人可以解释一下如何为此代码实现基于地图的条件
答案 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'; }
最后应该是这样的