配列アイテムを (グループごとに) 上下に移動したいと思います。アイテムは位置によってソートされます。
現在のデータは次のとおりです。
| 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 をどこで数えますか?