Search words in any order using backboneJS collect

2019-08-08 19:13发布

问题:

I have code to search the typed words from the text box, Get the typed word, search it in the collection and show the result in the HTML page.

In that i can search the word exactly as it is, using LIKE.

(i.e)

search: function(type,letters){
    var pattern = new RegExp(letters,"gi");
    return _(this.filter(function(data) {
        return pattern.test(data.get(type));
    }));
}

If the model has,

  1. Hello Doctor
  2. Hi Sir
  3. Hello World
  4. Welcome Programmer

And the user types as "Hello", it shows me

Hello Doctor Hello World

I need to display the result even if the user wrongly arranges the words,

i.e If the user types as "World Hello"

It is not showing any results. But, I want to show the user

Hello World

The same scenario is solved in web SQL.
Ref here

I want to achieve this in the backboneJS collection. Can you please help me?

回答1:

You could split your text on spaces and then iteratively filter the models and reduce them to the desired selection. For example:

var C = Backbone.Collection.extend({
    search: function(type, letters) {
        var words = letters.split(/\s+/), //array of words
            models = _.clone(this.models); //copy of the models

        //for each word, check if it is found in the given attribute
        _.each(words, function(word) {
            var pattern = new RegExp(word, "i");
            models = _.filter(models, function(model) {
                return pattern.test(model.get(type));
            });
        });

        return models;
    }
});

And a demo http://jsfiddle.net/ha8RM/1/