我有一个类似
的对象const myObj = {
hasError: true/false,
someProp: 'someValue'
}
基于这个目标,我有四个要评估的条件:
我想找到一种很好的,可读的方法来评估这4个条件,而不需要求助于if / else。
任何想法都非常感激。
答案 0 :(得分:1)
使用if/else
条件
if ( Object.keys(myObj).length === 0 ) {
// Object is empty
} else if ( myObj.hasError ) {
// hasError is true
} else if ( ! myObj.someProp ) {
// has error is false and someProp is undefined
} else {
// has error is false and some prop is defined
}
答案 1 :(得分:0)
将条件和随后的操作写为条件/操作元组的数组:
const actions = [
{if: o => !Object.keys(o).length, then: () => "empty"},
{if: o => o.hasError, then: () => "hasError"},
{if: o => !('someProp' in o), then: () => "someProp is undefined"},
{if: o => true, then: () => "got everything"}
];
现在find
第一个匹配条件并执行相关逻辑:
actions.find(action => action.if(myObj)).then()
如果无法保证至少满足一个条件,那么您需要检查find
的结果,以确保它不为空。
虽然在某些情况下这可能是一个优雅的解决方案,但你应该有一些很好的理由这样做,比如想要传递这些条件/动作对象,而不是仅使用常规的旧if
/ else
。
答案 2 :(得分:0)
也许是这样的?
function errMsg(obj_){
return !obj_ && 'Object is empty'
|| obj_.hasError && 'Error!'
|| !obj_.hasError &&
(
typeof obj_.foo === 'undefined'?
'foo is undefined':
'foo is defined'
)
;
}
errMsg() // "Object is empty"
errMsg({hasError:true}) // "Error!"
errMsg({hasError:false}) // "foo is undefined"
errMsg({hasError:false,foo:'bar'})// "foo is defined"
答案 3 :(得分:-1)
不确定if/then
有什么问题,但switch
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch)怎么样?
const myObj = {
hasError: false,
someProp : "something"
}
switch (true) {
case Object.keys(myObj).length === 0:
console.log("Object is empty.");
break;
case myObj.hasError === true:
console.log("hasError is true");
break;
case !myObj.hasError && !myObj.someProp:
console.log("hasError is false and someProp is undefined");
break;
case !myObj.hasError && myObj.someProp !== undefined:
console.log("hasError is false and someProp is defined");
break;
}