0

配列アイテムを (グループごとに) 上下に移動したいと思います。アイテムは位置によってソートされます。

現在のデータは次のとおりです。

| Index | Name | Pos | Group | Level
------------------------------------
| 0     | A    | 11  | 1     | 1
| 1     | B    | 12  | 1     | 1
| 2     | C    | 21  | 3     | 2
| 3     | D    | 22  | 3     | 2
| 4     | E    | 23  | 3     | 2
| 5     | F    | 31  | 2     | 2
| 6     | G    | 32  | 2     | 2
  • インデックス: 指定されたインデックス (自動)
  • 位置: すべての項目には、2 つの数字で構成される固有の位置があります。最初の数字はグループが変わるたびにカウントアップし、2 番目の数字はグループ内でカウントアップします。
  • グループ: アイテムはグループに分類されます
  • レベル: グループは同じレベル内でのみ移動できます

グループ 2 のすべてのアイテムをグループ 3 の上に移動したいと思います。結果は次のようになります

| Index | Name | Pos | Group | Level 
------------------------------------
| 0     | A    | 11  | 1     | 1
| 1     | B    | 12  | 1     | 1
| 2     | F    | 21  | 2     | 2
| 3     | G    | 22  | 2     | 2
| 4     | C    | 31  | 3     | 2
| 5     | D    | 32  | 3     | 2
| 6     | E    | 33  | 3     | 2

これを簡単な方法で行う方法がわかりません。私の試みは混乱に終わった。擬似コード:

items = new Array(); // global array, filled with the data above

function move_up(group_id) {
    // get group
    var group = new Array();
    for (var i = 0; i < items.length; i++) {
        if (items.group_id == group_id) 
            group.push(items[i]);
    }

    // get parent group
    var parent_group = new Array();
    var parent_group_id = 0;
    var level = group[0].level;
    var get_next = false;
    var x = 0;
    for (var i = items.length-1; i >= 0; i--) {
        if (items[i].group_id == group_id) {
            get_next = true;
        }

        if (get_next == true && 
            items[i].level == level && 
            items[i].group_id != group_id) {
            if (x == 0) {
                parent_group_id = items[i].group_id;
            }

            if (items[i].group_id == parent_group_id) {
                parent_group.push(items[i]);
            }

            x++;
        }
    }

    parent_group.reverse();

    // rebuild items array
    var items_new = new Array();
    var pos_1 = 1;
    var pos_2 = 1;
    for (var i = 0; i < items.length; i++) {
        if (items[i].group_id == group_id) {
            // do nothing
        } else if (items[i].group_id == parent_group_id) {
            // add group before parent group
            for (var k = 0; k < group.length; k++) {
                group[k].pos = pos_1 + pos_2;
                items_new.push(group[k]);                  
            }

            // add parent group after group
            for (var k = 0; k < parent_group.length; k++) {
                parent_group[k].pos = pos_1 + pos_2;
                items_new.push(parent_group[k]);                  
            }               
        } else {
            items[i].pos = pos_1 + pos_2;
            items_new.push(items[i]);
        }
    }

    return items_new;
} 

2回目の試行:

function move_up(group_id, parent_group_id) {
    items.sort(function(a, b) {
        // what here? move group up, parent_group down. what, if the groups 
        // have not the same num of items?


        // make sure, both items have the same level
        if (a.level == b.level) {
            // move group up
            if (a.group_id == group_id) {
                return -1;
            }

            // move parent group down
            if (a.group_id == parent_group_id) {
                return 1;
            }
        }        
    });
}

それは機能しておらず、ばかげているように見えます。誰かが私に思考の衝動を与えることができれば幸いです!

問題:

  • このような混沌としたコードを回避するにはどうすればよいですか? もっと良い方法を知っていますか?
  • pos_1 と pos_2 をどこで数えますか?
4

1 に答える 1

1

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sortを確認してください 。グループ ID を使用する比較関数を定義する必要があります。

于 2013-05-06T09:11:15.643 に答える