簡體   English   中英

使用JavaScript從數據庫檢索深層數據結構

[英]Retrive deep data stucture from database using JavaScript

我有一個如下的數據結構:

Task(id,name,subTasks[Task])

但是問題在於子任務可以包含具有另一個子任務的任務。 這樣可能會非常深入:

Task1 Contains SubTask1

SubTask1 contains it's sub tasks

並且您可以理解,這可以深入到很深的地方。

我可以從數據庫表中檢索這些數據。 但是如何將其存儲在Java腳本的數據結構中。 在不了解深度的情況下使用for循環是沒有用的,而且不是一種優雅的方法。 最佳的數據結構和數據遍歷方式是什么?

如果您想與其他程序(可能用其他語言編寫)之間來回傳送任意嵌套的數據結構,JSON格式是一種很好的格式,可以輕松地用JavaScript讀取或編寫-請參見JavaScript中的JSON對象 但是,如果您要完全在單個JavaScript程序內部創建和使用這樣的結構,則不需要JSON。

遍歷任意嵌套的數據結構的通用技術是遞歸 (有些人聲稱,“遞歸”是學習編程的2件最重要的事情之一,盡管並不需要他們在90%的成文法典- 斯波斯基蒂姆·布雷傑夫·阿特伍德威翰Sooriamurthi等)

有很多stackoverflow問題討論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;
    };
};

程序員常常試圖通過嵌套數據結構來強制數據適應嚴格的層次結構。 DOM操作和Javascript數據結構:扁平還是結構化? 認為有害的層次結構等。)

但是,當您沒有純層次結構時,非嵌套結構會更好。 有時,即使您只有一個純粹的層次結構,它們也可以更好地工作-例如,當您想查找事物而不遍歷整個結構時。 例如,“哪些任務取決於名為“庫存”的子任務?

在您的情況下,也許層次結構的許多替代方法之一可能會更好。 例如,一個關聯數組:

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM