2013-04-24 185 views
0

我正在通过一个xml文件进行过滤器搜索。到目前为止,我已经成功地显示了正确的节点,如果我只选择一个属性。 Bur当我想要显示具有两个相同属性的节点时,我得到至少具有一个正确属性的所有节点。继承人我的代码:如何在jquery中只获得过滤结果?

function loadFilter(xml){ 
    filterResults(xml); 
} 

function filterResults(xml) 
{ 
    match=true; 
    var candidate = $(xml).find("candidate"); 
    for (var i=0;i<candidate.length;i++) 
    { 
     var sex_key = $("#sex").val(); 
     var sex_value = $(candidate[i]).attr("sex"); 

     var eye_color = $("#eye-color").val(); 
     var eye_color_value = $(candidate[i]).attr("eyecolor"); 

     var transport = $("#transport").val(); 
     var transport_value = $(candidate[i]).attr("transport"); 

     var extra = $("#extra").val(); 
     var extra_value = $(candidate[i]).attr("extra"); 

     if(checkValue(sex_key, sex_value) == true) 
     { 
      match = true; 
      displayFilteredCandidate(); 
     } 

     if(checkValue(eye_color,eye_color_value) == true) 
     { 
      match = true; 
      displayFilteredCandidate(); 
     } 

     if(checkValue(transport,transport_value) == true) 
     { 
      match = true; 
      displayFilteredCandidate(); 
     } 

     if(checkValue(extra,extra_value) == true) 
     { 
      match = true; 
      displayFilteredCandidate(); 
     } 

     function displayFilteredCandidate(){ 
      console.log($(candidates[i].getElementsByTagName("img")[0])); 
      var candidateName = $(candidates[i]).attr("name")+" "+$(candidates[i]).attr("surname"); 
      var candidateImage = $(candidates[i].getElementsByTagName("img")[0]).attr("src"); 
      var cand = CandidateThumb(candidateName,"../candidates/"+candidateImage,candidates[i]); 
      cand.data({node:candidates[i]}).click(candidateClick); 
      $("#mainContent").append("<div id='candidates'></div>"); 
      $("#candidates").append(cand);     
     } 
    } 
} 

function checkValue(key, value) 
{ 
    var match = false; 

    if(key == value) 
    { 
     match = true; 
    } else { 
     match = false; 
    } 
    console.log(match); 
    return match; 
} 
+0

您是否听说过jQuery中的'.filter()'? – 2013-04-24 12:08:37

回答

0

那是因为你设置的比赛为true,每当匹配的属性之一。你想

if (
    checkValue(sex_key, sex_value) == true && 
    checkValue(eye_color,eye_color_value) == true && 
    checkValue(transport,transport_value) == true && 
    checkValue(extra,extra_value) == true 
) { 
    match = true; 
    displayFilteredCandidate(); 
} 

,让你检查所有属性,只显示如果所有属性匹配的候选人。

编辑:如果你想匹配至少两个,做这样

if (
    checkValue(sex_key, sex_value) + 
    checkValue(eye_color,eye_color_value) + 
    checkValue(transport,transport_value) + 
    checkValue(extra,extra_value) 
    >= 2 
) { 
    match = true; 
    displayFilteredCandidate(); 
} 

(这是建立在事实,如果你有一个+添加布尔,他们成为真正的整数(1 ,0为FALSE))

+0

hej。谢谢你的回答,但它仍然不起作用,但我会尝试更多的方向。 – user2315366 2013-04-24 13:37:35

+0

看到我的更新,可能是你想要的。 – 2013-04-24 13:51:23

+0

再次感谢您的回答,Willem您的方法最终效果很好。非常感谢。 – user2315366 2013-04-25 10:50:28

0
function filterResults(xml) 
{ 
    var numToMatch = 2; 
    var matched = 0; 
    var sex_key = $("#sex").val(); 
    var eye_color = $("#eye-color").val(); 
    var transport = $("#transport").val(); 
    var extra = $("#extra").val(); 
    var candidate = $(xml).find("candidate").each(function(){ 

    if(this.attr("sex") == sex_key) 
     matched++; 
    if(this.attr("eyecolor") == eye_color) 
     matched++; 
    if(this.attr("transport") == transport) 
     matched++; 
    if(this.attr("extra") == extra) 
     matched++; 
    if(matched >= numToMatch) 
     displayFilteredCandidate(); 
} 

我想,如果你想用你的比较功能,因为我觉得它很酷,ü可以做到这一点。

function filterResults(xml) 
{ 
    var numToMatch = 2; 
    var matched = 0; 
    var sex_key = $("#sex").val(); 
    var eye_color = $("#eye-color").val(); 
    var transport = $("#transport").val(); 
    var extra = $("#extra").val(); 
    var candidate = $(xml).find("candidate").each(function(){ 

    matched += checkValue(this.attr("sex"), sex_key); 
    matched += checkValue(this.attr("eyecolor"), eye_color); 
    matched += checkValue(this.attr("transport"), transport); 
    matched += checkValue(this.attr("extra"), extra); 
    if(matched >= numToMatch) 
     displayFilteredCandidate(); 
}