mirror of https://github.com/nocodb/nocodb
Pranav C
3 years ago
committed by
Pranav C
5 changed files with 130 additions and 15 deletions
@ -0,0 +1,79 @@
|
||||
// ref : https://medium.com/weekly-webtips/js-implementing-auto-complete-f4c5a5d5c009
|
||||
|
||||
class NcAutocompleteTree { |
||||
constructor() { |
||||
this.trie = null |
||||
this.suggestions = [] |
||||
} |
||||
|
||||
newNode() { |
||||
return { |
||||
isLeaf: false, |
||||
children: {} |
||||
} |
||||
} |
||||
|
||||
add(word) { |
||||
if (!this.trie) { |
||||
this.trie = this.newNode() |
||||
} |
||||
|
||||
let root = this.trie |
||||
for (const letter of word.text.toLowerCase()) { |
||||
if (!(letter in root.children)) { |
||||
root.children[letter] = this.newNode() |
||||
} |
||||
root = root.children[letter] |
||||
} |
||||
root.value = root.value || [] |
||||
root.value.push(word) |
||||
} |
||||
|
||||
find(word) { |
||||
let root = this.trie |
||||
for (const letter of word) { |
||||
if (letter in root.children) { |
||||
root = root.children[letter] |
||||
} else { |
||||
return null // if not found return null
|
||||
} |
||||
} |
||||
|
||||
return root // return the root where it ends search
|
||||
} |
||||
|
||||
traverse(root) { |
||||
if (root.value && root.value.length) { |
||||
this.suggestions.push(...root.value) |
||||
} |
||||
|
||||
for (const letter in root.children) { |
||||
this.traverse(root.children[letter]) |
||||
} |
||||
} |
||||
|
||||
complete(word, CHILDREN = null) { |
||||
this.suggestions = [] |
||||
const root = this.find(word.toLowerCase()) |
||||
|
||||
if (!root) { |
||||
return this.suggestions |
||||
} // cannot suggest anything
|
||||
|
||||
const children = root.children |
||||
|
||||
let spread = 0 |
||||
for (const letter in children) { |
||||
this.traverse(children[letter], word + letter) |
||||
spread++ |
||||
|
||||
if (CHILDREN && spread === CHILDREN) { |
||||
break |
||||
} |
||||
} |
||||
|
||||
return this.suggestions |
||||
} |
||||
} |
||||
|
||||
export default NcAutocompleteTree |
Loading…
Reference in new issue