0

私は以下のようなデータ構造を持っています:

Task(id,name,subTasks[Task])

しかし問題は、subTask に別の subTask を持つ Task を含めることができることです。これは、次のように非常に深く実行できます。

Task1 Contains SubTask1

SubTask1 contains it's sub tasks

これが非常に深く実行される可能性があることを理解できます。

これらのデータはデータベース テーブルから取得できます。しかし、これをJavaスクリプトのデータ構造に保存するにはどうすればよいですか。深層部を知らずに for ループを使用するのは役に立たず、エレガントな方法ではありません。最適なデータ構造とデータ トラバーサルの方法は何でしょうか?

4

2 に答える 2

0

任意にネストされたデータ構造を他のプログラム (おそらく他の言語で書かれたもの) との間で転送したい場合、JSON 形式は JavaScript で簡単に読み書きできる優れた形式です -- JavaScriptの JSON オブジェクト を参照してください。しかし、単一の JavaScript プログラムで完全に内部的にそのような構造を作成して使用する場合は、JSON は必要ありません。

任意にネストされたデータ構造をトラバースする一般的な手法は再帰です。(「再帰」は、書かれたコードの 90% で必要とされていないにもかかわらず、プログラミングについて学ぶための 2 つの最も重要なことの 1 つであると主張する人もいます - SpolskyTim BrayJeff AtwoodWenhamSooriamurthiなど)。

JavaScript での再帰について議論するスタックオーバーフローの質問はたくさんあります。それらのいくつかを読み、少しのコードを書き、それをテストしてから、短いコードを投稿すると、より良い答えが得られます。完璧である必要はありませ

// define the "Task" class
function Task(id, name, depth){
    this.id = id;
    this.name = name;
    this.depth = depth;
    this.subTask = []; // Use "[]" rather than "{}" so it works with "forEach".
    this.stringify_name_and_all_subtasks = function(depth){
        var return_string = this.depth + ":" + this.name + " ";
        // If "forEach" doesn't work for you,
        // use the "Compatibility" code in
        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
        this.subTask.forEach( function(entry){
            return_string += entry.stringify_name_and_all_subtasks(depth);
        });
        return return_string;
    };
};
于 2013-09-07T16:19:20.213 に答える
0

プログラマーは、ネストされたデータ構造を使用して、データを厳密な階層に適合させようとすることがよくあります。( 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>
于 2013-09-09T15:08:46.900 に答える