【问题标题】:Filtering json similar to mysql "like" operator过滤json类似于mysql“like”操作符
【发布时间】:2016-10-04 18:58:18
【问题描述】:

我想过滤我的 json,并尝试使用通配符 -“%”模拟简单的 mysql 运算符“like”,但使用一个......某种“技巧”。

我们有一些项目:

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

当我在 MySQL 中使用 PHP 时,我使用 '%' 替换用户输入中的每个空格。因此,当用户键入“b ba”时,查询如下所示:

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

用户获得项目:“绝命毒师”。我想用 javascript 和 json 模拟相同的行为。

我最接近的实现如下:

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
}

这种方式有一个可怕的错误,当用户键入“b ba”时,用户会得到“Breaking Bad”和“Bates Motel”,因为“Bates”这个词有“b”和“ba”。

在我尝试再次编写之前,我想问一下是否有更好/更智能的方法来根据需要过滤 json?可能是我在尝试再次发明轮子。

【问题讨论】:

  • 也许是正则表达式?类似:/.*b.*ba.*/i

标签: javascript json filtering


【解决方案1】:

您可以使用$.grep()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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多