2

私はかなり反復的なswitchcaseステートメントを持っており、物事を行う最も簡単な方法を学ぶために、SOに目を向けて、次のよりエレガントな解決策があるかどうかを確認したいと思いました。

        switch(id)
        {
            case 'ib-02a':
                if(direction == 'left')
                    setHash('ib-02b');
                break;
            case 'ib-02b':
                if(direction == 'right')
                    setHash('ib-02a');
                if(direction == 'left')
                    setHash('ib-02c');
                break;
            case 'ib-02c':
                if(direction == 'right')
                    setHash('ib-02b');
                if(direction == 'left')
                    setHash('ib-02d');
                break;
            case 'ib-02d':
                if(direction == 'right')
                    setHash('ib-02c');
            break;

            case 'ib-03a':
                if(direction == 'left')
                    setHash('ib-03b');
                break;
            case 'ib-03b':
                if(direction == 'right')
                    setHash('ib-03a');
                if(direction == 'left')
                    setHash('ib-03c');
                break;
            case 'ib-03c':
                if(direction == 'right')
                    setHash('ib-03b');
                if(direction == 'left')
                    setHash('ib-03d');
                break;
            case 'ib-03d':
                if(direction == 'right')
                    setHash('ib-03c');
            break;

            case 'pb-05a':
                if(direction == 'left')
                    setHash('pb-05b');
                break;
            case 'pb-05b':
                if(direction == 'right')
                    setHash('pb-05a');
                if(direction == 'left')
                    setHash('pb-05c');
                break;
            case 'pb-05c':
                if(direction == 'right')
                    setHash('pb-05b');
                if(direction == 'left')
                    setHash('pb-05d');
                break;
            case 'pb-05d':
                if(direction == 'right')
                    setHash('pb-05c');
            break;
        }

スワイプイベントを読んでいて、スワイプしている要素のIDがib-02 *、ib-03 *、またはpb-05 *のいずれかと一致する場合、適切なIDに対してsetHash関数を呼び出しています。* aをスワイプしている場合は、左にスワイプして*bにします。* bをスワイプしている場合は、右にスワイプして* aに、左にスワイプして*cに移動します。などなど、常に*aと*dの間にあります。

これを行うには繰り返しの少ない方法があるはずですが、最善のアプローチが正確にはわかりません。

4

7 に答える 7

2

それらをオブジェクトにマッピングするのはどうですか?次にsetHash、取得した値でを使用します。

var ids = {
    'pb-05c' : {
        left : 'pb-05d',
        right : 'pb-05b'
    }
    ...
}

function setHashes(id,direction){
    if(id && ids[id]){
        id = ids[id];
        if(direction && id[direction]){
            setHash(id[direction]);
        }
    }
}

それはすべて検索であり、条件評価はありません。これはパフォーマンスに良い場合があります。

于 2012-08-18T00:35:34.110 に答える
2

、、、の4つの主要なケースがありaます。これらの文字列bに基づいてswitchステートメントを作成できます。これを試してください。cd

var c = id.slice(0, 5); // "ib-02" or "ib-03" or "ib-04" ...
var which = id.slice(-1); // "a" or "b" or "c" or "d"
switch(which) {
    case 'a':
       if(direction == 'left')
             setHash(c+'b');
          break;
    case 'b':
       if(direction == 'right')
             setHash(c+'a');
       if(direction == 'left')
             setHash(c+'c');
          break;
    case 'c':
       if(direction == 'right')
             setHash(c+'b');
       if(direction == 'left')
             setHash(c+'d');
          break;
    case 'd':
       if(direction == 'right')
            setHash(c+'c');
          break;
}
于 2012-08-18T00:44:56.480 に答える
1

次のように、すべてのデータテーブルを駆動することができます。

var logicData = {
    // format is the id first and then an array with the left, then right value for the hash
    // leave an item as an empty string if you don't ever want to go that direction
    'ib-02a': ['ib-02b', ''],
    'ib-02b': ['ib-02c', 'ib-02a'],
    'ib-02c': ['ib-02d', 'ib-02d']
    // fill in the rest of the data table here
};

function setNewHash(id, direction) {
    var hash, data = logicData[id];
    if (data) {
        if (direction == 'left') {
            hash = data[0];
        } else if (direction == 'right') {
            hash = data[1];
        }
        if (hash) {
            setHash(hash);
        }
    }
}
于 2012-08-18T00:39:43.387 に答える
1
id='ib-02a'; //you have string id, this one is for demo
id=[id.slice(0,--id.length), id.charAt(--id.length)];

switch(id[1]){
    case 'a':
        if(direction == 'left'){setHash(id[0]+'b');}
        break;
    case 'b':
        if(direction =='right'){setHash(id[0]+'a');}
        if(direction == 'left'){setHash(id[0]+'c');}
        break;
    case 'c':
        if(direction == 'right'){setHash(id[0]+'b');}
        if(direction == 'left'){setHash(id[0]+'d');}
        break;
    case 'd':
        if(direction == 'right'){setHash(id[0]+'c');}
        break;
}

ケースbとcが「左」または「右」のみの場合はelse、これらのifステートメントでinを使用できます。

于 2012-08-18T00:57:30.657 に答える
1

undefinedとGitaarLabの一般的な方向性が好きです。そこでは、実際にアルゴリズムを解決し、アルゴリズムを実装しただけです。確認するために、アルゴリズムは基本的に、IDの最後の文字をleftインクリメントし、最後の文字をデクリメントするものですが、下または上rightには移動しません。そこで、最後の文字を数値に変換し、if / elseまたはcaseステートメントを使用するのではなく、直接インクリメントまたはデクリメントするというコンパクトな実装を行いました。ad

function setNewHash(id, direction) {
    var base = id.substr(0, 5);
    var tag = id.charCodeAt(5), newTag;
    var nav = {left: 1, right: -1};
    var delta = nav[direction];
    if (delta) {
        tag += delta;
        newTag = String.fromCharCode(tag);
        if (newTag >= 'a' && newTag <= 'd') {
            setHash(base + newTag);
        }
    }
}

実用的なテストケース:http://jsfiddle.net/jfriend00/gwfLD/

于 2012-08-18T01:19:09.217 に答える
0

IDをさまざまな部分に分割し、実行する直前にそれらを再構築することができますsetHash

function chunkId(id) {
    // use a regex or string split or something to convert
    // "ib-05a" to ["ib-05", "a"]
    return ["ib-05", "a"];
}

function next(str) {
    // return the next letter in the alphabet here
    return "b";
}

function prev(str) {
    // return the prev letter in the alphabet here
    return "b";
}

function swipe (id, direction) {
    var array = chunkId(id);
    // you can only swipe left if not on "d"
    if (direction === "left" && id[1] != "d") {
        setHash(id[0] + next(id[1])); // build hash based on next character
    }
    // you can only swipe right if not on "a"
    if (direction === "right" && id[1] != "a") {
        setHash(id[0] + prev(id[1])); // build hash based on prev character
    }
}
于 2012-08-18T00:32:40.193 に答える
0

IDと方向のチェックを切り替えて、明確にすることができます。

switch (direction) {
  case 'left':
    switch (id) {
      case 'ib-02a': setHash('ib-02b'); break;
      case 'ib-02b': setHash('ib-02c'); break;
      case 'ib-02c': setHash('ib-02d'); break;
      case 'ib-03a': setHash('ib-03b'); break;
      case 'ib-03b': setHash('ib-03c'); break;
      case 'ib-03c': setHash('ib-03d'); break;
      case 'pb-05a': setHash('pb-05b'); break;
      case 'pb-05b': setHash('pb-05c'); break;
      case 'pb-05c': setHash('pb-05d'); break;
    }
    break;
  case 'right':
    switch (id) {
      case 'ib-02b': setHash('ib-02a'); break;
      case 'ib-02c': setHash('ib-02b'); break;
      case 'ib-02d': setHash('ib-02c'); break;
      case 'ib-03b': setHash('ib-03a'); break;
      case 'ib-03c': setHash('ib-03b'); break;
      case 'ib-03d': setHash('ib-03c'); break;
      case 'pb-05b': setHash('pb-05a'); break;
      case 'pb-05c': setHash('pb-05b'); break;
      case 'pb-05d': setHash('pb-05c'); break;
    }
    break;
}

次に、IDを分割することで単純化できます。

var first = id.substr(0, 5);
var last = id.substr(6);
switch (direction) {
  case 'left':
    switch (last) {
      case 'a': setHash(first + 'b'); break;
      case 'b': setHash(first + 'c'); break;
      case 'c': setHash(first + 'd'); break;
    }
    break;
  case 'right':
    switch (last) {
      case 'b': setHash(first + 'a'); break;
      case 'c': setHash(first + 'b'); break;
      case 'd': setHash(first + 'c'); break;
    }
    break;
}
于 2012-08-18T00:50:46.667 に答える