2016-07-16 11 views
1

名前を使用するだけでなく、いくつかの組み合わせを見つけることができる拡張検索を作成しようとしています...コードはうまく動作しますが、もし私が - keeper Englandのような機能を探したいのならば。このコード行は動作しません((val.position.search(myExp)!= -1)||(val.nationality.search(myExp)!= -1))JsとJqueryを使用して正確な検索を作成する方法

$("#search").keyup(function() { 
    var field = $("#search").val(); 
    var myExp = new RegExp(field, "i"); 
    $.getJSON("players.json", function(data) { 
     var output = "<ul>"; 
     $.each(data, function(key, val) { 
      if ((val.name.search(myExp) != -1) || (val.position.search(myExp) != -1) || ((val.position.search(myExp) != -1) || (val.nationality.search(myExp) != -1))) { 
       output += "<li>"; 
       output += '<p class="name">' + val.name + '</p>'; 
       output += '<p>' + val.position + '</p>'; 
       output += '<p>' + val.dateOfBirth + '</p>'; 
       output += '<p>' + val.nationality + '</p>'; 
       output += '<p>' + val.contractUntil + '</p>'; 
       output += '<p>' + val.marketValue + '</p>'; 
       output += "</li>"; 
      } 
     }); 
     output += "</ul>"; 
     $("#update").html(output); 
    }); 
}); 

{ 
     "id":2138, 
     "name":"Thibaut Courtois", 
     "position":"Keeper", 
     "jerseyNumber":13, 
     "dateOfBirth":"1992-05-11", 
     "nationality":"Belgium", 
     "contractUntil":"2019-06-30", 
     "marketValue":"35,000,000 ˆ" 
    }, 
    { 
     "id":2140, 
     "name":"Jamal Blackman", 
     "position":"Keeper", 
     "jerseyNumber":27, 
     "dateOfBirth":"1993-10-27", 
     "nationality":"England", 
     "contractUntil":"2019-06-30", 
     "marketValue":"250,000 ˆ" 
    }, 
+0

何Array.filter' 'については? – webdeb

答えて

1

あなたはする必要がありますあなたのクエリで複数の単語を持っているので、複数の検索クエリを実行します。
「イングランドのキーパー」=>「イングランド」と「キーパー」

だからあなたは「イングランド」によっても、「キーパー」によってアイテムをフィルタリングします。 。

小さな機能を作成するのが最善で、それぞれがその一部を行います:

// Note: this function returns the filter function 
var myFilter = function(regex) { 
    return function(item) { 
    return regex.test(item.name) 
     || regex.test(item.position) 
     || regex.test(item.nationality) 
    } 
} 

// this is a higher order function, takes the items and the full searchString as arguments 
var findMatches = function(items, searchString) { 
    // make a copy of the items/data 
    var found = items.slice(0, item.length); 

    // split the searchString, and filter the items by it 
    searchString.split(' ').forEach(function(part) { 
    found = found.filter(myFilter(new RegEx(part, 'i')) 
    }); 

    return found; 
} 

今、あなたはあなたのコードでそれを使用することができます。

... 
var output = "<ul>"; 
var filteredData = findMatches(data, field); 
$.each(filteredData, function(key, val) { 
    // filteredData should be fine, you can just render it 
} 
... 
関連する問題