根据条件返回一个字符串,而不使用if / else

时间:2016-11-23 17:44:45

标签: javascript functional-programming

我有一个类似

的对象
const myObj = {
  hasError: true/false,
  someProp: 'someValue'
}

基于这个目标,我有四个要评估的条件:

  1. 对象为空
  2. hasError为真
  3. 错误为false且someProp未定义
  4. 错误为false且定义了一些prop
  5. 我想找到一种很好的,可读的方法来评估这4个条件,而不需要求助于if / else。

    任何想法都非常感激。

4 个答案:

答案 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有什么问题,但switchhttps://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;
}