Ife Javascript Task 07--2017515

3506 ワード

今日完成したこと:
  • 学習データ構造--ツリー英語学習資料https://code.tutsplus.com/articles/data-structures-with-javascript-tree--cms-23393 中国語学習資料https://segmentfault.com/a/1190000000740261
  • 夜は簡単なDivcreator関数を書きました.明日は続けて書きます.
  • 明日の計画の件:
  • は、関数受容層数を書き込み、対応するdiv
  • を生成する.
  • iterateのやり方を勉強してください.
    遭遇した問題:
    1.なし
    収穫:
    以下は簡単な例です.参考と勉強の資料として使えます.
    function Node(data) {
        this.data = data;
        this.parent = null;
        this.children = [];
    }
    
    function Tree(data) {
        var node = new Node(data);
        this._root = node;
    }
    
    var tree = new Tree('CEO');
     
    // {data: 'CEO', parent: null, children: []}
    tree._root;
    
    Tree.prototype.traverseDF = function(callback) {
     
        // this is a recurse and immediately-invoking function 
        (function recurse(currentNode) {
            // step 2
            for (var i = 0, length = currentNode.children.length; i < length; i++) {
                // step 3
                recurse(currentNode.children[i]);
            }
     
            // step 4
            callback(currentNode);
             
            // step 1
        })(this._root);
     
    };
    
    Tree.prototype.traverseDF = function(callback) {
     
        // this is a recurse and immediately-invoking function 
        (function recurse(currentNode) {
            // step 2
            for (var i = 0, length = currentNode.children.length; i < length; i++) {
                // step 3
                recurse(currentNode.children[i]);
            }
     
            // step 4
            callback(currentNode);
             
            // step 1
        })(this._root);
     
    };
    
    Tree.prototype.traverseBF = function(callback) {
        var queue = new Queue();
         
        queue.enqueue(this._root);
     
        currentTree = queue.dequeue();
     
        while(currentTree){
            for (var i = 0, length = currentTree.children.length; i < length; i++) {
                queue.enqueue(currentTree.children[i]);
            }
     
            callback(currentTree);
            currentTree = queue.dequeue();
        }
    };
    
    Tree.prototype.contains = function(callback, traversal) {
        traversal.call(this, callback);
    };
    
    tree.contains(function(node){
        if (node.data === 'two') {
            console.log(node);
        }
    }, tree.traverseBF);
    
    Tree.prototype.add = function(data, toData, traversal) {
        var child = new Node(data),
            parent = null,
            callback = function(node) {
                if (node.data === toData) {
                    parent = node;
                }
            };
     
        this.contains(callback, traversal);
     
        if (parent) {
            parent.children.push(child);
            child.parent = parent;
        } else {
            throw new Error('Cannot add node to a non-existent parent.');
        }
    };
    
    Tree.prototype.remove = function(data, fromData, traversal) {
        var tree = this,
            parent = null,
            childToRemove = null,
            index;
     
        var callback = function(node) {
            if (node.data === fromData) {
                parent = node;
            }
        };
     
        this.contains(callback, traversal);
     
        if (parent) {
            index = findIndex(parent.children, data);
     
            if (index === undefined) {
                throw new Error('Node to remove does not exist.');
            } else {
                childToRemove = parent.children.splice(index, 1);
            }
        } else {
            throw new Error('Parent does not exist.');
        }
     
        return childToRemove;
    };
    
    function findIndex(arr, data) {
        var index;
     
        for (var i = 0; i < arr.length; i++) {
            if (arr[i].data === data) {
                index = i;
            }
        }
     
        return index;
    }