Search code examples
javascriptajaxmergeautocompleteunique

How to cache the results in the simple autocomplete


I am write a simple textarea tag completer script. So how to can i cache the old results?

I try following code:

                var lastQuery = term.toLowerCase();

                if(fallback[0]){

                                var dl = [];

                        for(k=0; k<fallback.length; k++){

                                var name = fallback[k].name.toLowerCase();

                                if( name.substr(0, lastQuery.length) == lastQuery ){

                                    dl.push(fallback[k]);

                                }       

                        }
                                if(dl[0]){
                                    callback(dl); // "callback" Dropdown trigger
                                    return false;
                                } 
                                else 
                                    return true;


              // .......... following the autocomplete function ...........

I'm using for merge: fallback.concat(dl) , "dl" is a succesfully data on the autocomplete.

But array not unique and this a problem.

It full codes:

                var lastQuery = term.toLowerCase();

                if(fallback[0]){

                                var dl = [];

                        for(k=0; k<fallback.length; k++){

                                var name = fallback[k].name.toLowerCase();

                                if( name.substr(0, lastQuery.length) == lastQuery ){

                                    dl.push(fallback[k]);

                                }       

                        }
                                if(dl[0]){
                                    callback(dl);
                                    return false;
                                }
                                else
                                    return true;                                                                    
                }   

            // Here is autocomplete function

            $.ajax({
                url: homeurl+'/api/hashtag/index.php',
                type: "POST",
                dataType: 'json',
                data: { query: term },
                success: function (data) {
                    var x = data;

                    if(x.hashtag){

                                var dl = [];

                        for(i=0; i<x.hashtag.length; i++){

                                var name = x.hashtag[i].name.toLowerCase();

                                if( name.substr(0, lastQuery.length) == lastQuery ){

                                    dl.push(x.hashtag[i]);

                                }

                        }
                        if(dl[0]){
                            fallback = fallback.concat(dl);
                            callback(dl);
                        }
                        else
                        callback(null);

                    } else {
                        callback(null);
                    }

                }
            });

Footnote: return false; get wrong (not in dom, just script stop work) after the a few keystroke...

                       if(dl[0]){
                           callback(dl);
                           return false;
                       }
                       else
                           return true;                                 

Solution

  • Uhhh, try try try finally i am solved it: function arrayUniqueForHashtag()

    function arrayUniqueForHashtag(array) {
        var a = array.concat();
        for(var i=0; i<a.length; ++i) {
            for(var j=i+1; j<a.length; ++j) {
                if(a[i].name == a[j].name)
                    a.splice(j--, 1);
            }
        }
    
        return a;
    }
    

    call the cache key search: return false;

    Finally code:

                var lastQuery = term.toLowerCase();
    
                if(fallback[0]){
    
                                var dl = [];
    
                        for(k=0; k<fallback.length; k++){
    
                                var name = fallback[k].name.toLowerCase();
    
                                if( name.substr(0, lastQuery.length) == lastQuery ){
    
                                    dl.push(fallback[k]);
    
                                }       
    
                        }
                                if(dl[0]){
                                    callback(dl);
                                    return false;
                                }
                               // else
                               //     return true;                                                                    
                }   
    
            // Here is autocomplete function
    
            $.ajax({
                url: homeurl+'/api/hashtag/index.php',
                type: "POST",
                dataType: 'json',
                data: { query: term },
                success: function (data) {
                    var x = data;
    
                    if(x.hashtag){
    
                                var dl = [];
    
                        for(i=0; i<x.hashtag.length; i++){
    
                                var name = x.hashtag[i].name.toLowerCase();
    
                                if( name.substr(0, lastQuery.length) == lastQuery ){
    
                                    dl.push(x.hashtag[i]);
    
                                }
    
                        }
                        if(dl[0]){
                            fallback = arrayUniqueForHashtag(fallback.concat(dl));
                            callback(dl);
                        }
                        else
                        callback(null);
    
                    } else {
                        callback(null);
                    }
    
                }
            });
    

    Working now on the caching data.