node tree

Usage no npm install needed!

<script type="module">
  import ndtreejs from 'https://cdn.skypack.dev/ndtreejs';



  • node and tree


  • npm install ndtreejs



const ndcls = require('ndtreejs').ndcls
const wjson = require('ndtreejs').ndutil.wjson         

var tree = new ndcls.Root()
var nd1 = tree.$append_child()
var nd2 = nd1.$append_child()
var nd3 = nd1.$append_child() 
var nd4 = nd3.$append_child()
var nd5 = nd4.$add_rsib() 
var nd6 = nd1.$add_rsib()
var nd7 = nd6.$prepend_child()
var nd8 = nd6.$append_child()
var nd9 = nd6.$append_child()


   [0] : b49510d4-fcd2-4a47-b09c-79b32aad5c4d
       [1] : a64275db-aa33-4d7e-a301-01dc206a4ed7
           [2] : 4633aca6-4829-49f7-978a-737c0465ee4f
           [3] : 447d5d9b-1f6d-4755-b4df-700608f5a0e6
               [4] : ac6e17c1-2f2a-4c02-b7ed-faab1cc4dec4
               [5] : be806683-e81b-4386-a8e0-3e09774479b9
       [6] : cadd1dac-ec52-4640-9e9d-d68c486ee63f
           [7] : 244bd3c9-701e-43c9-9622-b9bdd4d32af7
           [8] : 8424ee0d-b5a8-4a41-8517-1a561d758f27
           [9] : 4f4933d6-7309-4b11-b3c1-586f0d26630b
               [10] : da9881c7-1cae-49b7-b87e-f00fe6c64506
               [11] : fcc05507-fdae-45d8-8523-7780d51d32bb
               [12] : 5bdf7c5a-39d2-4a3c-9ec7-c16526b91d08
               [13] : dff3e119-f8f5-4806-9da1-0dcac907c376
               [14] : 9d0f1cee-35c7-4ed4-bf60-967705701d1d
               [15] : 55b37a55-72d3-4fd2-a36d-c66cc8190d03

var ntree = ndcls.load('ndict.json') 


//msg can be anything JS permitted
//src/source can-ONLY be a-node-instance


> nd9
 [9e06e363] {}

> nd9.send_to(nd1,"hello,i am nd9")
 [9e06e363] {} hello,i am nd9

    because currently nodejs event-target have some display-bug,
    so the implement did NOT extends the EventTarget directly,
    instead, the implement use a internal private , use .et can check it,
    "$XXX...XXX__" event-type  is reserved for internal using,others are free

get structure

var al = tree.$sdfs_srch_action_list()
  [ '$fstch' ],
  [ '$fstch' ],
  [ '$rsib' ],
  [ '$fstch' ],
  [ '$rsib' ],
  [ '$parent', '$parent', '$rsib' ],
  [ '$fstch' ],
  [ '$rsib' ],
  [ '$rsib' ],
  [ '$fstch' ],
  [ '$rsib' ],
  [ '$rsib' ],
  [ '$rsib' ],
  [ '$rsib' ],
  [ '$rsib' ],
  [ '$parent', '$parent', '$parent' ]

var ntree = ndcls.build_from_srch_action_list(al)

> ntree.$sdfs_repr()
[0] : 947005fe-70fc-4ee1-b554-4309b448843b
    [1] : e4be2505-d3ac-4f2d-bd8b-3dbeacd51c70
        [2] : 9d4c2127-0165-4643-b457-db80d1699238
        [3] : 03c3e386-47a2-405f-982c-73de645bae92
            [4] : 2fe7070b-3a66-49a9-b9a2-17ce819a2eac
            [5] : 1514f5df-5226-443d-878b-f9a3f88d9f96
    [6] : 94e47fea-004a-4975-af0e-b54181734086
        [7] : 998b88c6-eddb-4732-80f0-7e44e023a3d7
        [8] : 1243ab4d-4967-423f-8e76-e34c31d6562f
        [9] : e9f4708a-dcd7-4221-a348-601d36585599
            [10] : 5bac1dd3-00e6-4bdd-8742-3231702e67cf
            [11] : 8a44b51b-292d-43ad-ba1b-a06522cd8812
            [12] : 425e7f67-684a-48e8-8b13-6c581142d6c5
            [13] : 7809127b-9d45-47fa-8330-8755beafe06a
            [14] : 4507b13b-d707-453c-94d7-e59f4ad1bc69
            [15] : 09e34bb7-9768-4c43-af7c-e5f5b5f648e5


  • sdfs is dfs-preorder , it could be used for things such as "scope"
  • sedfs just like html-sequence, enter/begin-.....-end/leave, it could be used for things such as "parse"
  • edfs is dfs-postorder, normally it is USELESS , it could be used for things such as "execution" when leaf-node could be treated as "instructions"
  • $replace method normally should be used together with edfs, it is for deep-copy a "template-tree" and replace itself with this "template-tree", it could be used for things such as "call"


  • struct_eq_ignore_order is slow, but it can recognize tree-topology-only difference
  • struct_eq_keep_order is fast ,but it can NOT recognize real similarity
  • notmally USELESS , but useful when with non-standard nested-input, such as {a=b,B:c,<1,2,3,4,5>} mixed-style structure


  • get_cu_sign
  • get_internal_sign_ignore_order
  • get_internal_sign_keep_order
  • get_sign_ignore_order
  • get_sign_keep_order
  • struct_eq_keep_order
  • struct_eq_ignore_order


  • $add_lsib
  • $add_rsib
  • $ances
  • $ances_count
  • $append_child
  • $append_children
  • $pbreadth
  • $breadth
  • $children
  • $children_count
  • $clone
  • $count
  • $depth
  • $deses
  • $disconn
  • $dlmost_des
  • $drmost_des
  • $dump
  • $dump2file
  • $edfs
  • $edfs_next
  • $edfs_prev
  • $fsibs
  • $fstch
  • $fstsib
  • $height
  • $insert_child
  • $is_fstch
  • $is_inited
  • $is_leaf
  • $is_lonely
  • $is_lstch
  • $is_root
  • $lcin
  • $lsib
  • $lsib_of_fst_ance_having_lsib
  • $lst_lyr_deses
  • $lstch
  • $lstsib
  • $luncle
  • $lyr
  • $offset
  • $parent
  • $prepend_child
  • $psibs
  • $rcin
  • $rm_all_children
  • $rm_fstch
  • $rm_lstch
  • $rm_some_children
  • $rm_which
  • $root
  • $rsib
  • $rsib_of_fst_ance_having_rsib
  • $runcle
  • $sdfs
  • $sdfs2mat
  • $sdfs_next
  • $sdfs_prev
  • $sdfs_repr
  • $sedfs
  • $sedfs_next
  • $sedfs_prev
  • $sedfs_repr
  • $sibs
  • $sibs_count
  • $sibseq
  • $some_ances
  • $some_children
  • $some_lyrs_deses
  • $some_sibs
  • $which_ance
  • $which_child
  • $which_lyr_deses
  • $which_sib
  • $width
  • $nest_dict
  • $sdfs_next_action_for_srch
  • $sdfs_srch_action_list
  • $replace_with
  • $sdfs_leafs
  • $sdfs_nonleafs
  • $sdfs_leaf_index
  • $sdfs_nonleaf_index
  • et
  • regis_recv_from_handler
  • send_to


refer to https://dom.spec.whatwg.org/#concept-tree A tree is a finite hierarchical tree structure. In tree order is preorder, depth-first traversal of a tree.

  • $is_parent_of(nd)

    An object that participates in a tree has a parent, which is either null or an object, and has children, which is an ordered set of objects. An object A whose parent is object B is a child of B.
  • $is_root_of(nd)

    The root of an object is itself, if its parent is null, or else it is the root of its parent. The root of a tree is any object participating in that tree whose parent is null.
  • $is_descendant_of(nd)

    An object A is called a descendant of an object B, if either A is a child of B or A is a child of an object C that is a descendant of B.        
  • $is_inclusive_descendant_of(nd)

    An inclusive descendant is an object or one of its descendants.        
  • $is_ancestor_of(nd)

    An object A is called an ancestor of an object B if and only if B is a descendant of A.
  • $is_inclusive_ancestor_of(nd)

    An inclusive ancestor is an object or one of its ancestors.
  • $is_sibling_of(nd)

    An object A is called a sibling of an object B, if and only if B and A share the same non-null parent.
  • $is_inclusive_siblings_of(nd)

    An inclusive sibling is an object or one of its siblings.
  • $is_preceding_of(nd)

    An object A is preceding an object B if A and B are in the same tree and A comes before B in tree order.
  • $is_following_of(nd)

    An object A is following an object B if A and B are in the same tree and A comes after B in tree order.
  • $is_fstch_of(nd)

    The first child of an object is its first child or null if it has no children.
  • $is_lstch_of(nd)

    The last child of an object is its last child or null if it has no children.
  • $is_previous_sibling_of(nd)

    The previous sibling of an object is its first preceding sibling or null if it has no preceding sibling.
  • $is_next_sibling_of(nd)

    The next sibling of an object is its first following sibling or null if it has no following sibling.
  • $index()

    The index of an object is its number of preceding siblings, or 0 if it has none.


> require('ndtreejs')
  ndfunc: {
    calc_next_id: [Function: calc_next_id],
    update_nodes_ids: [Function: update_nodes_ids],
    creat_root: [Function: creat_root],
    creat_nd: [Function: creat_nd],
    is_inited: [Function: is_inited],
    is_root: [Function: is_root],
    is_fstch: [Function: is_fstch],
    is_lstch: [Function: is_lstch],
    is_leaf: [Function: is_leaf],
    is_lonely: [Function: is_lonely],
    is_id: [Function: is_id],
    prepend_child: [Function: prepend_child],
    append_child: [Function: append_child],
    insert_child: [Function: insert_child],
    add_rsib: [Function: add_rsib],
    add_lsib: [Function: add_lsib],
    get_fstch: [Function: get_fstch],
    get_rsib: [Function: get_rsib],
    get_children: [Function: get_children],
    get_lstch: [Function: get_lstch],
    get_which_child: [Function: get_which_child],
    get_some_children: [Function: get_some_children],
    get_fstsib: [Function: get_fstsib],
    get_lstsib: [Function: get_lstsib],
    get_preceding_sibs: [Function: get_preceding_sibs],
    get_following_sibs: [Function: get_following_sibs],
    get_sibs: [Function: get_sibs],
    get_which_sib: [Function: get_which_sib],
    get_some_sibs: [Function: get_some_sibs],
    get_sibseq: [Function: get_sibseq],
    get_lsib: [Function: get_lsib],
    get_lyr: [Function: get_lyr],
    get_breadth: [Function: get_breadth],
    get_count: [Function: get_count],
    get_depth: [Function: get_depth],
    get_height: [Function: get_height],
    get_fst_lyr_des_depth: [Function: get_fst_lyr_des_depth],
    get_lst_lyr_des_depth: [Function: get_lst_lyr_des_depth],
    get_which_lyr_des_depth: [Function: get_which_lyr_des_depth],
    get_root: [Function: get_root],
    get_parent: [Function: get_parent],
    get_ances: [Function: get_ances],
    get_which_ance: [Function: get_which_ance],
    get_some_ances: [Function: get_some_ances],
    get_rsib_of_fst_ance_having_rsib: [Function: get_rsib_of_fst_ance_having_rsib],
    get_sdfs_next: [Function: get_sdfs_next],
    get_drmost_des: [Function: get_drmost_des],
    get_sdfs_prev: [Function: get_sdfs_prev],
    get_sdfs: [Function: get_sdfs],
    get_lsib_of_fst_ance_having_lsib: [Function: get_lsib_of_fst_ance_having_lsib],
    get_dlmost_des: [Function: get_dlmost_des],
    get_edfs_next: [Function: get_edfs_next],
    get_edfs_prev: [Function: get_edfs_prev],
    get_edfs: [Function: get_edfs],
    'clear_$visited': [Function: clear_$visited],
    get_sedfs_next: [Function: get_sedfs_next],
    is_sedfs_traverse_finished: [Function: is_sedfs_traverse_finished],
    get_sedfs_prev: [Function: get_sedfs_prev],
    get_sedfs: [Function: get_sedfs],
    get_deses: [Function: get_deses],
    get_fst_lyr_deses: [Function: get_fst_lyr_deses],
    get_lst_lyr_deses: [Function: get_lst_lyr_deses],
    get_which_lyr_deses: [Function: get_which_lyr_deses],
    get_some_deses: [Function: get_some_deses],
    nd2ele: [Function: nd2ele],
    sdfs2mat: [Function: sdfs2mat],
    sdfs2edfs: [Function: sdfs2edfs],
    sdfs2sedfs: [Function: sdfs2sedfs],
    edfs2mat: [Function: edfs2mat],
    edfs2sdfs: [Function: edfs2sdfs],
    edfs2sedfs: [Function: edfs2sedfs],
    sedfs2mat: [Function: sedfs2mat],
    sedfs2sdfs: [Function: sedfs2sdfs],
    sedfs2edfs: [Function: sedfs2edfs],
    update_disconnected_nodes: [Function: update_disconnected_nodes],
    update_orig_nodes: [Function: update_orig_nodes],
    leafize: [Function: leafize],
    rootize: [Function: rootize],
    disconnect: [Function: disconnect],
    rm_fstch: [Function: rm_fstch],
    rm_lstch: [Function: rm_lstch],
    rm_which: [Function: rm_which],
    rm_some: [Function: rm_some],
    rm_all: [Function: rm_all],
    update_treeid: [Function: update_treeid],
    update_one_nodeid: [Function: update_one_nodeid],
    prepend_child_tree: [Function: prepend_child_tree],
    append_child_tree: [Function: append_child_tree],
    add_rsib_tree: [Function: add_rsib_tree],
    add_lsib_tree: [Function: add_lsib_tree],
    insert_child_tree: [Function: insert_child_tree]
  ndcls: { Node: [Function: Node], load: [Function: load],load_from_nest_dict:[Function: load_from+nest_dict] },
  ndutil: {rjson: [Function: rjson], wjson [Function: wjson]}