2013-05-06 33 views
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組的每一個項目上移,上方組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; 
} 

第二次嘗試:

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?
+2

爲什麼不使用排序功能?或者你需要能夠移動特定的組? – 2013-05-06 09:07:44

+0

@ eric.itzhak:感謝您的快速回復。我不想排序,我想修改數組。 – 2013-05-06 14:51:51

回答

相關問題