添加不是函数
add is not a function
我不知道为什么会出现此错误,我正在使用 github 中的 trie.js 并尝试使用添加功能,但它说 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
您的代码应移至在 Trie 声明和原型初始化之后。
Trie 构造函数 (Trie
) 声明将被提升到代码块的顶部。因此,您的代码可以成功地用它实例化一个新对象。但是,在您尝试 use 对象时,Trie 原型尚未初始化。原型初始化语句只是普通语句,因此它们将在 在 调用 longestWord()
.
之后执行
因此,如果您将当前在 function Trie ...
之前的所有内容移动到整个代码块的末尾,它应该可以工作(除非出现其他错误)。
您在向新 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: {}
}
}
我不知道为什么会出现此错误,我正在使用 github 中的 trie.js 并尝试使用添加功能,但它说 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
您的代码应移至在 Trie 声明和原型初始化之后。
Trie 构造函数 (Trie
) 声明将被提升到代码块的顶部。因此,您的代码可以成功地用它实例化一个新对象。但是,在您尝试 use 对象时,Trie 原型尚未初始化。原型初始化语句只是普通语句,因此它们将在 在 调用 longestWord()
.
因此,如果您将当前在 function Trie ...
之前的所有内容移动到整个代码块的末尾,它应该可以工作(除非出现其他错误)。
您在向新 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: {}
}
}