0

我写了以下代码:

var json = {};
var test = {
    run: function(json)
    {
        var choice = (function(){

            if (json.a != '' && json.b == '' && json.c == ''){ return 'a'} else
            if (json.a == '' && json.b != '' && json.c == ''){ return 'b'} else
            if (json.a == '' && json.b == '' && json.c != ''){ return 'c'} else
            if (json.a != '' && json.b != '' && json.c == ''){ return 'd'} else
            if (json.a != '' && json.b == '' && json.c != ''){ return 'e'} else
            if (json.a == '' && json.b != '' && json.c != ''){ return 'f'} else
                return 'g';
        })();

        switch (choice)
        {
            case 'a': console.log('a');
                break;

            case 'b': console.log('b');
                break;

            case 'c': console.log('c');
                break;

            case 'd': console.log('d');
                break;

            case 'e': console.log('e');
                break;

            case 'f': console.log('f');
                break;

            case 'g': console.log('no arguments');
        }
    }
};

json.a = 'xxx';
json.b = '';
json.c = 'yyy';

test.run(json);

这将返回“e”,但 json 每次都可能不同。

当每个“if”语句都有很多代码行时,这种代码结构更易于阅读。

想象 :

if(statement){

//100 lines of code

}else
    if(statement){

    //100 lines of code
    }else ........
    //and so on.

我想知道有没有比这个解决方案更好的设计模式?我将不胜感激。

4

4 回答 4

1

容易多了。在循环jsonfor in循环,如果有任何输入,则将该键设置为output. 如果在那之后还有另一个输入,则作为“错误参数”返回。如果测试完成,则返回output.

var json = {};

var test = {

    run: function(json)
    {
        var output = null;
        for (var s in json) {
            if (json[s]) {
                if (output) {
                    return "Bad arguments.";
                } else {
                    output = s;   
                }
            }
        }
        return output;
    }
} 

json.a='xxx';   
json.b='';
json.c='';

console.log(test.run(json));

http://jsfiddle.net/r7Vyq/1/

于 2013-11-01T18:54:26.050 回答
0

那么,您将如何捕获用户的输入?如果这些属性旨在相互排斥,那么您很可能会使用单选按钮作为捕获输入的方式。您一次只能选择一个单选按钮。那么就不需要检查所有三个属性。只需检查一次,无论哪个有价值,都返回它。

var choice = (function(){
  if (json.a != '') { return 'a'; }
  if (json.b != '') { return 'b'; }
  if (json.c != '') { return 'c'; }
  return 'd';
}
于 2013-11-01T18:47:43.073 回答
0

我找到了解决方案:

var json = {};

var test = {

run: function(json)
{

    var output='';
    var func =[];
    for (var s in json) {
        if (json[s]) {
            output +=s;
        }
    }


    func['a'] = function()
    {
        return console.log('a');
    }

    func['b'] = function()
    {
        return console.log('b');
    }

    func['c'] = function()
    {
        return console.log('c');
    }

    func['ab'] = function()
    {
        return console.log('ab')
    }

    func['ac'] = function()
    {
        return console.log('ac')
    }       

    func['bc'] = function()
    {
        return console.log('bc')
    }

    func[''] = function()
    {
        return console.log('bad arguments')
    }

    func[output]();


}
}

json.a='xxx';
json.b='';
json.c='yyy';

test.run(json);
于 2013-11-01T19:49:14.317 回答
0

您可以使用许多数组和对象方法

例如

var res= [json.a,json.b,json.c,json.d].filter(function(str){
     return str.length;
});

var output= res.length==1 ? res[0] : "Bad args";

查看您正在使用的 JSON 会有所帮助

DEMO

于 2013-11-01T18:53:01.543 回答