2016-06-04 1 views
1

필자는 json을 필터링하고 싶습니다. 그리고 와일드 카드로 "like"와 같은 간단한 mysql 연산자를 "%"하지만 몇 가지 "트릭"으로 시뮬레이트하려고합니다. 내가 MySQL과 PHP를 사용하는 경우json을 mysql "like"연산자와 비슷하게 필터링하기

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

, 내가 '%'를 사용하여 사용자 입력의 모든 공백을 대체 :

우리는 일부 항목이있다. 사용자 유형 "B 바는"쿼리처럼 보이는 때, :

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

사용자 항목을 가져옵니다 "브레이킹 배드을". 나는 javascript와 json으로 같은 동작을 시뮬레이트하고 싶다. 그 방법은 사용자 유형 "B 바"사용자가 단어 "베이츠"렸기 때문에 '브레이킹 배드'와 '베이츠 모텔을 "얻을 때이 하나의 끔찍한 버그를 가지고

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".

다시 작성하기 전에 원하는대로 json을 필터링하는 것이 더 좋고/현명한 방법인지 묻고 싶습니다. 나는 바퀴를 다시 발명하려고 노력하고 있을지도 모른다.

+2

를 사용할 수 있습니까? 다음과 같은 것 : /.*b.*ba.*/i – Deep

답변

2

당신은 아마 정규 표현식 $.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>

관련 문제