我想上下移動數組項目(按組)。這些項目按位置排序。如何逐組上移項目並更新每個位置?
這裏的當前數據:
| 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?
爲什麼不使用排序功能?或者你需要能夠移動特定的組? – 2013-05-06 09:07:44
@ eric.itzhak:感謝您的快速回復。我不想排序,我想修改數組。 – 2013-05-06 14:51:51