1

こんにちは、2 つの配列を互いに比較し、いずれかの値が一致する場合はリスト要素を非表示にしようとしています。

1 つの配列はリスト アイテムに添付されるタグで、もう 1 つはユーザー入力です。

1 つのユーザー入力作業を相互参照できるようで、複数のタグに対して複数の単語を取得できないため、問題が発生しています。

ユーザー入力単語の量とタグの量が変わる可能性があります。私は試しinArrayましたが、運がありませんでした。どんな助けでも大歓迎です。以下のコードを参照してください。

function query_searchvar() {
   var searchquery=document.navsform.query.value.toLowerCase();
   if (searchquery == '') {
      alert("No Text Entered");
   }
   var snospace = searchquery.replace(/\s+/g, ',');
   event.preventDefault();
   var snospacearray = snospace.split(',');

   $('li').each(function() {
      var searchtags = $(this).attr('data-searchtags');
      //alert(searchtags);
      var searcharray = searchtags.split(',');
      //alert(searcharray);
      var searchtrue=-1;

      for(var i = 0, len = searcharray.length; i < len; i++){
          if(searcharray[i] == searchquery){
              searchtrue = 0;
              break;
          }
      }
      if (searchtrue == 0) {
         $(this).show("normal");
      }
      else {
         $(this).hide("normal");
      }
   });
}

さて、以下のコードを実装しようとしましたが、うまくいきませんでした。両方の配列をチェックしていないようです。

function query_searchvar()
{
var searchquery=document.navsform.query.value.toLowerCase();
if(searchquery == '')
{alert("No Text Entered");
}
var snospace = searchquery.replace(/\s+/g, ' ');
event.preventDefault();
var snospacearray = snospace.split(' ');
alert(snospacearray[1]);

$('li').each(function() {
  var searchtags = $(this).attr('data-searchtags');
  alert(searchtags);
  var searcharray = searchtags.split(' ');
    alert(searcharray[0]);

jQuery.each(snospacearray, function(key1,val1){
    jQuery.each(searcharray,function(key2,val2){
        if(val1 !== val2) {$(this).hide('slow');}
    });
});
});
}

作業コード:

function query_searchvar()
{
var searchquery=document.navsform.query.value.toLowerCase();
if(searchquery == '')
{alert("No Text Entered");
}
var queryarray = searchquery.split(/,|\s+/);

event.preventDefault();


$('li').each(function() {
  var searchtags = $(this).attr('data-searchtags');
  //alert(searchtags);
  var searcharray = searchtags.split(',');
//alert(searcharray);
var found = false;
for (var i=0; i<searcharray.length; i++)
    if ($.inArray(searcharray[i], queryarray)>-1) {
        found = true;
        break;
    }

if (found == true )
  {

 $(this).show("normal");
  }
else {
$(this).hide("normal");
}
});
}
4

2 に答える 2

1
var snospace = searchquery.replace(/\s+/g, ',');
var snospacearray = snospace.split(',');

正規表現で分割できることに注意してください。したがって、上記は次のようになります。

var queryarray = searchquery.split(/,|\s+/);

両方の配列にアイテムが含まれているかどうかを確認するには、次のコードを使用します。

var found = searcharray.some(function(tag) {
    return queryarray.indexOf(tag) > -1;
});

これは ES5 準拠のブラウザでのみ機能しますが :-) 他のブラウザをサポートするには、

var found = false;
for (var i=0; i<searcharray.length; i++)
    if ($.inArray(searcharray[i], queryarray)>-1) {
        found = true;
        break;
    }

プレーンjsでは、なしjQuery.inArray:

var found = false;
outerloop: for (var i=0; i<searcharray.length; i++)
    for (var j=0; j<queryarray.length; j++)
        if (searcharray[i] == queryarray[j]) {
            found = true;
            break outerloop;
        }

少し高速なアルゴリズム (非常に大きな配列にのみ必要) は、両方の配列を並べ替えてから線形に実行することです。

于 2012-07-25T10:45:01.420 に答える
0

問題を解決する疑似コードを次に示します。

get both arrays
for each item in array 1
    for each element in array 2
        check if its equal to current element in array 1
           if its equal to then hide what you want

この coude wise の例は次のようになります。

jQuery.each(array1, function(key1,val1){
    jQuery.each(array2,function(key2,val2){
        if(val1 == val2) {$(your element to hide).hide();}
    });
});

わからないことがあれば聞いてください:)

于 2012-07-24T14:46:18.533 に答える