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

もっと簡単に。ループ内をjsonループしfor 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 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 に答える
0

さて、ユーザーの入力をどのようにキャプチャしますか? これらのプロパティが互いに排他的であることを意図している場合は、入力をキャプチャする方法としてラジオ ボタンを使用する可能性が高くなります。一度に選択できるラジオ ボタンは 1 つだけです。3 つのプロパティすべてをチェックする必要はありません。それぞれを一度だけチェックし、値のある方を返します。

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 に答える