добавить не функция - PullRequest
1 голос
/ 13 июля 2020

Понятия не имею, почему я получаю эту ошибку, я использую tr ie. js из github и пытаюсь использовать функцию добавления, но там сказано, что tr ie .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;
    }
}

Весь код, который я добавил сам, находится перед функцией Tr ie (). Остальное из этого репозитория github: https://gist.github.com/alexandervasyuk/b12c3d2c306539decb2a#file -tr ie - js

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы вызываете новый Tr ie перед добавлением к нему прототипов.

Это рабочая версия:

https://jsbin.com/jokekuw/3/edit?js, вывод

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

function Trie() {
    this.head = {
            key : ''
        , children: {}
    }
}
0 голосов
/ 13 июля 2020

Ваш код должен быть перемещен в после объявления Tr ie и инициализации прототипа.

Объявление функции конструктора Tr ie (Trie) будет поднято в верхняя часть блока кода. Таким образом, ваш код может успешно создать с его помощью экземпляр нового объекта. Однако в то время, когда вы пытаетесь использовать объект, прототип Tr ie еще не инициализирован. Операторы инициализации прототипа - это просто обычные операторы, поэтому они будут выполнены после вашего вызова longestWord().

Таким образом, если вы переместите все свое, что в настоящее время находится до function Trie ..., в конец общего блока кода, он должен работать (за исключением других ошибок).

...