【问题标题】:How to save last searched when using search on input?对输入使用搜索时如何保存上次搜索的内容?
【发布时间】:2019-04-25 19:52:24
【问题描述】:

我正在尝试编写一个算法来保存最近搜索的关键字。问题是用户没有触发搜索,而是每次键入内容时都会触发搜索。目前,我正在尝试保存最后搜索的关键字并检查下一个是否从最后一个开始以丢弃最后一个。

async _persistSearch(term) {
        const serachLog = await this._getLastSearchedFile()
        console.log("[SEARCH]", serachLog);
        if (Object.keys(serachLog) == 0) {
            serachLog.searches = [term];
            serachLog.lastUpdated = Date.now()
        } else if (term.startsWith(this.lastSearhed)) {
            const toPersist = serachLog.searches.filter((value) => value != this.lastSearhed).push(term);
            serachLog.searches = toPersist;
        } else {
            serachLog.searches.push(term);
        }
        this.lastSearhed = term;
        await writeJSONFile(this.searchesFile, serachLog);
    }

例如对于输入 [so, som, some, somet, someth,somethi, somethin, something, somethin] 为 [something]

【问题讨论】:

  • 这听起来像是您需要去抖动您的搜索输入?知道所有以前的搜索词有什么价值?
  • 谢谢,去抖效果很好
  • 通常会,很高兴我能提供帮助

标签: javascript algorithm search


【解决方案1】:

您应该使用 Trie(前缀树)来保存搜索到的关键字。假设你只处理小写英文字母,那么每个节点最多可以有 26 个子节点。对于每个新的搜索关键字,调用startsWith方法来检查这个新的关键字是否是之前关键字的任何前缀。

如果您需要更多解释为什么应该在您的案例中使用 Trie,请阅读此 https://en.wikipedia.org/wiki/Trie

这个数据结构的java实现如下。

class Trie {
    class TrieNode{
        private char c;
        private Map<Character, TrieNode> map;
        private boolean isLeaf;   

        TrieNode() {
            this.map = new HashMap<>();
        }
        TrieNode(char c) {
            this.c = c;
            this.map = new HashMap<>();
        }
    }
    private TrieNode root;
    /** Initialize your data structure here. */
    public Trie() {
        root = new TrieNode();
    }

    /** Inserts a word into the trie. */
    public void insert(String word) {
        TrieNode currNode = root;
        for(int i = 0; i < word.length(); i++) {
            char currChar = word.charAt(i);
            if(!currNode.map.containsKey(currChar)) {
                TrieNode newNode = new TrieNode(currChar);    
                currNode.map.put(currChar, newNode);
                currNode = newNode;
            }
            else {
                currNode = currNode.map.get(currChar);
            }
            if(i == word.length() - 1) {
                currNode.isLeaf = true;
            }
        }
    }

    /** Returns if the word is in the trie. */
    public boolean search(String word) {
        TrieNode currNode = root;
        for(int i = 0; i < word.length(); i++) {
            if(!currNode.map.containsKey(word.charAt(i))) {
                return false;
            }
            currNode = currNode.map.get(word.charAt(i));
            if( i == word.length() - 1 && !currNode.isLeaf) {
                return false;
            }
        }
        return true;
    }

    /** Returns if there is any word in the trie that starts with the given prefix. */
    public boolean startsWith(String prefix) {
        TrieNode currNode = root;
        for(int i = 0; i < prefix.length(); i++) {
            if(!currNode.map.containsKey(prefix.charAt(i))) {
                return false;
            }
            currNode = currNode.map.get(prefix.charAt(i));
        }
        return true;        
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多