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
Post a Comment