【问题标题】:add is not a functionadd 不是函数
【发布时间】:2020-07-13 19:40:43
【问题描述】:

我不知道为什么会出现此错误,我正在使用来自 github 的 trie.js 并尝试使用 add 函数,但它说 trie.add 不是函数。

var longestWord = function(words) {
    console.log('test');
    let trie = new Trie();
    trie.add("test");
    console.log(trie);
};


longestWord('testing');

function Trie() {
    this.head = {
            key : ''
        , children: {}
    }
}

Trie.prototype.add = function(key) {

    var curNode = this.head
        , newNode = null
        , curChar = key.slice(0,1);

    key = key.slice(1);
    
    while(typeof curNode.children[curChar] !== "undefined" 
        && curChar.length > 0){
        curNode = curNode.children[curChar];
        curChar = key.slice(0,1);
        key = key.slice(1);
    }

    while(curChar.length > 0) {
        newNode = {
                key : curChar
            , value : key.length === 0 ? null : undefined
            , children : {}
        };

        curNode.children[curChar] = newNode;

        curNode = newNode;

        curChar = key.slice(0,1);
        key = key.slice(1);
    }

};

Trie.prototype.search = function(key) {
    var curNode = this.head
        , curChar = key.slice(0,1)
        , d = 0;

    key = key.slice(1);

    while(typeof curNode.children[curChar] !== "undefined" && curChar.length > 0){
        curNode = curNode.children[curChar];
        curChar = key.slice(0,1);
        key = key.slice(1);
        d += 1;
    }

    if (curNode.value === null && key.length === 0) {
        return d;
    } else {
        return -1;
    }

}

Trie.prototype.remove = function(key) {
    var d = this.search(key);
    if (d > -1){
        removeH(this.head, key, d);
    }
}

function removeH(node, key, depth) {
    if (depth === 0 && Object.keys(node.children).length === 0){
        return true;
    } 

    var curChar = key.slice(0,1);

    if (removeH(node.children[curChar], key.slice(1), depth-1)) {
        delete node.children[curChar];
        if (Object.keys(node.children).length === 0) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

我自己添加的所有代码都在函数 Trie() 之前。其余部分来自这个 github 仓库:https://gist.github.com/alexandervasyuk/b12c3d2c306539decb2a#file-trie-js

【问题讨论】:

    标签: javascript function trie


    【解决方案1】:

    在向它添加原型之前调用新的 Trie。

    这是工作版本:

    https://jsbin.com/jokekuw/3/edit?js,output

    var longestWord = function(words) {
        console.log('test');
        let trie = new Trie();
        trie.add("test");
    };
    
    function Trie() {
        this.head = {
                key : ''
            , children: {}
        }
    }
    

    【讨论】:

    • 您可以在 Stack Overflow 站点中创建完整的可执行示例,就像 OP 一样。真的没有必要使用外部游乐场站点。
    【解决方案2】:

    您的代码应该被移动到 Trie 声明和原型初始化之后。

    Trie 构造函数 (Trie) 声明将被提升到代码块的顶部。因此,您的代码可以成功地用它实例化一个新对象。但是,在您尝试使用该对象时,Trie 原型尚未初始化。原型初始化语句只是普通语句,因此它们将在您调用longestWord()之后执行。

    因此,如果您将当前位于 function Trie ... 之前的所有内容移动到整个代码块的末尾,它应该可以工作(除非出现其他错误)。

    【讨论】:

    • 另外,您找到的代码并不是真正的 GitHub “repo”;这只是一个代码要点。它已经 5 年了,无法知道是否有人成功使用过它。
    猜你喜欢
    • 1970-01-01
    • 2021-02-01
    • 2022-01-14
    • 2011-03-29
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多