2016-06-04 5 views
1

Ich möchte meine JSON filtern, und ich versuche similar mysql Operator "liked" mit Wildcard - "%", aber mit einem ... eine Art "Trick" zu simulieren.Filtern von json ähnlich wie mysql "like" -Operator

Wir haben einige Artikel:

var items = 
[ 
    {id: 1,name: "Breaking Bad"}, 
    {id: 2,name : "Bates Motel"} 
] 

Wenn ich PHP mit MySQL verwenden, ersetze ich alle Räume in Eingabe Benutzer '%' verwenden. Wenn der Benutzer also "b ba" eingibt, sieht die Abfrage wie folgt aus:

$this->db->query("SELECT * FROM items WHERE name LIKE '%b%ba% "); 

Benutzer erhält Artikel: "Breaking Bad". Ich möchte das gleiche Verhalten mit Javascript und JSON simulieren.

Meine engstene Umsetzung wie folgt aussieht:

this.search = function() { 
    var query = $.trim($('.player-search').val()) 
    query = query.toUpperCase() 

    $.grep(that.items, function(v) { 
     if(that.filter(v.name,query) === true) { 
      $('.player-serial[data-id="'+v.id+'"]').fadeIn(200) 
     } else { 
      $('.player-serial[data-id="'+v.id+'"]').fadeOut(200) 
     } 
    }) 
} 

this.filter = function(word,query) { 
    var tmp = query.toUpperCase().split(" "), 
     n = tmp.length, 
     i = 0 

    for(var k in tmp) { 
     word.toUpperCase().indexOf(tmp[k]) >= 0 && ++i 
    } 

    return (i == n) ? true : false 
} 

diese Weise einen schrecklichen Fehler hat, wenn Benutzertypen "b ba", Benutzer bekommt "Breaking Bad" und "Bates Motel", becouse Wort "Bates" hat "b" und "ba".

Bevor ich versuche, es noch einmal zu schreiben, möchte ich fragen, gibt es bessere/bessere Möglichkeiten, JSON zu filtern, wie ich will? Es kann sein, dass ich versuche, das Rad wieder zu erfinden.

+2

Vielleicht regexp? Etwas wie: /.*b.*ba.*/i – Deep

Antwort

2

können Sie $.grep() verwenden, String.prototype.match(), Array.prototype.every(), String.prototype.slice()

var items = [{ 
 
    id: 1, 
 
    name: "Breaking Bad" 
 
}, { 
 
    id: 2, 
 
    name: "Bates Motel" 
 
}]; 
 
var query = "b ba"; 
 
var res = $.grep(items, function(v) { 
 
    // if space character included in query match first word to 
 
    // first word of `v.name`, last word to last word in `v.name` 
 
    if (/\s/.test(query)) { 
 
    var curr = v.name.match(/\w+/g).map(function(_q) { 
 
     return _q.toLowerCase() 
 
    }); 
 
    var q = query.match(/\w+/g); 
 
    if (q.every(function(val, index) { 
 
     return val === curr[index].slice(0, val.length) 
 
    })) return true 
 
    } else { 
 
    if (q.toLowerCase() === v.name.toLowerCase().slice(0, q.length)) { 
 
     return true 
 
    } 
 
    } 
 
}); 
 

 
console.log(res[0])
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> 
 
</script>