プログラマーは、ネストされたデータ構造を使用して、データを厳密な階層に適合させようとすることがよくあります。(
DOM 操作と Javascript データ構造: フラットまたは構造化?、
有害と見なされる階層 など )
ただし、純粋な階層がない場合は、ネストされていない構造の方が適しています。構造全体をたどらずに物事を調べたい場合など、純粋な階層がある場合でも、よりうまく機能することがあります。たとえば、「「在庫回転」という名前のサブタスクに依存するタスクは何ですか?」
おそらく、階層に代わる多くの選択肢の1つが、
あなたの場合にうまく機能するかもしれません. たとえば、連想配列:
<script>
"use strict";
// global task list
var tasklist_by_id = [];
var task_name_to_id = {};
// add a new task to global tasklist
function add_task(id, name, supertaskid){
tasklist_by_id[ id ] = {"id":id, "name":name, "supertaskid":supertaskid};
/* in other words,
var new_task = {};
new_task.id = id;
new_task.name = name;
new_task.supertaskid = supertaskid;
tasklist_by_id[ id ] = new_task;
*/
task_name_to_id[ name ] = id;
};
function ancestors_of( task_id ){
if( task_id ){
var my_name = tasklist_by_id[ task_id ].name;
var my_supertaskid = tasklist_by_id[task_id].supertaskid;
var my_ancestors = ancestors_of( my_supertaskid );
var ancestor_string = " -- " + my_name + my_ancestors;
return ancestor_string;
}else{
return ".";
};
};
function test(){
add_task( 1, "Main task #1", 0 );
add_task( 2, "Subtask 1", task_name_to_id[ "Main task #1" ] );
add_task( 3, "Sub-subtask 1", task_name_to_id[ "Subtask 1" ] );
add_task( 4, "Another Subtask of Main task 1", task_name_to_id[ "Main task #1" ] );
add_task( 5, "Sub-sub-subtask 1", task_name_to_id[ "Sub-subtask 1" ] );
add_task( 6, "rotate_stock", task_name_to_id["Sub-sub-subtask 1" ])
// What task is the parent task(s) of "rotate_stock" ?
var some_task_name = "rotate_stock";
var some_task_id = task_name_to_id[some_task_name];
var ancestors = ancestors_of( some_task_id );
alert("The ancestry line of " + some_task_name + " is " + ancestors);
}
test();
</script>