javascript - How to move up items by group and update each position? -


i'd move array items (by group) , down. items sorted position.

here's current data:

| index | name | pos | group | level ------------------------------------ | 0     |    | 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 
  • index: given index (auto)
  • pos: every item has unique position, composed of 2 numbers: first number counts everytime when group changes, 2nd 1 counts within group.
  • group: items sorted in groups
  • level: groups can moved within same level

i'd move every item of group 2 up, above group 3. result should be:

| index | name | pos | group | level  ------------------------------------ | 0     |    | 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 

i don't know how easy way. try ended in chaos. pseudocode:

items = new array(); // global array, filled data above  function move_up(group_id) {     // group     var group = new array();     (var = 0; < items.length; i++) {         if (items.group_id == group_id)              group.push(items[i]);     }      // parent group     var parent_group = new array();     var parent_group_id = 0;     var level = group[0].level;     var get_next = false;     var x = 0;     (var = items.length-1; >= 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;     (var = 0; < items.length; i++) {         if (items[i].group_id == group_id) {             // nothing         } else if (items[i].group_id == parent_group_id) {             // add group before parent group             (var k = 0; k < group.length; k++) {                 group[k].pos = pos_1 + pos_2;                 items_new.push(group[k]);                               }              // add parent group after group             (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; }  

2nd try:

function move_up(group_id, parent_group_id) {     items.sort(function(a, b) {         // here? move group up, parent_group down. what, if groups          // have not same num of items?           // make sure, both items have same level         if (a.level == b.level) {             // move group             if (a.group_id == group_id) {                 return -1;             }              // move parent group down             if (a.group_id == parent_group_id) {                 return 1;             }         }             }); } 

it's not working , looks stupid. i'd appreciate if give me thinking-impulse!

problems:

  • how avoid chaos code this? know better way?
  • where count pos_1 , pos_2 up?

check out https://developer.mozilla.org/en-us/docs/javascript/reference/global_objects/array/sort need define comparison function uses group id.


Comments