2010-12-01 9 views
2

私は私が扱っている特有の問題があります。私はあいまいになり始めます。誰かがもっと詳細を必要とするなら、私はプロジェクトの背景を伝えることができます。jQuery/javascriptはリスト内の値を見つけます

私は(チェックボックスから選択)選択したIDがあります。161

をそして、私は多くのそのようなIDの行を持っている:私は上記のIDの行のうち、指定する必要があり

["161", "165", "573", "190", "150", "283"] // this one would be it 
["160", "311", "793", "309", "301"] 
["161", "165", "395", "306"] // this one would be it 
["160", "311", "668", "191", "216", "301"] 

を、どのIDが選択されているかを示します。これはあまり難しくありません。IDの各行をループし(実際の配列をループして)、thisIDList[i] == selectedIDを実行します。複数のIDが選択されているときに私がいる

問題は次のとおりです。

["161", "306"]は、今私は、行をループする必要があり、選択されたIDの両方を持っている行を特定します。

["161", "165", "573", "190", "150", "283"] // wouldn't be it 
["160", "311", "793", "309", "301"] 
["161", "165", "395", "306"] // this one would be it 
["160", "311", "668", "191", "216", "301"] 

などです。選択したIDの範囲は1から5または6のいずれかです。["161", "306", "216", "668"]

誰かが正しい方向に向かうことができますか?私は、これはリストAの各項目が一覧B.で見つける必要がある二つのリストを比較するような基本的にはあると思い


編集

私は、行がで見つかっていない他のIDを含めることができますことを追加する必要があります選択されたリスト。選択されたIDが["161", "306"]だったのであれば、その後、["161", "165", "395", "306"]は、もう少し情報を更新して提供するつもり165と395


編集

が含まれているにもかかわらず、まだ試合になるでしょう。私はラジオボタンのリストを持っている:ラジオボタンをクリックすると

<ul> 
    <li data="{attrID: '160,197,161,194,195,190,162' }">Lorem Ipsum</li> 
</ul> 

<input type="checkbox" name="filter" value="301" /> 
<input type="checkbox" name="filter" value="161" /> 
<input type="checkbox" name="filter" value="573" /> 
<input type="checkbox" name="filter" value="190" /> 

私は順不同リストを持って、各リストは、データ属性を(私はメタデータプラグインを使用しています)があります:

// set the selected IDs 
selectedIds = []; 
$("input[name=filter]:checked").each(function(){ 
    selectedIds.push(this.value); 
}); 

// loop through each list     
$('ul li').each(function() { 

    // get and set the metadata for the attrID key 
    meta = $(this).metadata(); 
    idList = meta.attrID; 

    // find out if the selected IDs are found in this idList 
    var isMatch = matches(selectedIds,idList); 

    console.log(isMatch); 

    // my plan was to do this 
    if(isMatch){ 
     // do something with this list item 
    } 


}); 

答えて

3

これは、jQueryのからinArray機能を使用しています。ターゲットセットのすべての要素を含むセットのインデックスを含む配列を返します。あなたの例がそうであるようにあなたのセットが比較的小さい場合、それは十分に速くなければなりません。あなたのデータに基づいて

function matches(target, sets) 
{ 
    var matches= []; 
    for (var i = 0, setsLen = sets.length; i < setsLen; ++i) { 
     if (isSubset(target,sets[i])) { 
      matches.push(i); 
     } 
    } 
    return matches; 
} 

function isSubset(target, set) 
{ 
    for (var j = 0, targetLen = target.length; j < targetLen; ++j) { 
     if ($.inArray(target[j], set) < 0) { 
      return false; 
     } 
    } 
    return true; 
} 

少しテストスクリプト:

$(function(){ 
    var sets = [ 
        ["161", "165", "573", "190", "150", "283"], 
        ["160", "311", "793", "309", "301"], 
        ["161", "165", "395", "306"], 
        ["160", "311", "668", "191", "216", "301"] 
    ]; 

    alert(matches([ "161" ], sets)); 
    alert(matches([ "161","306" ], sets)); 
}); 

編集:私はあなたの追加に基づいて私の例を更新しました。私はisSubset関数を使う必要があると思います。私は文脈のために残りの答えを残しておきます。

+0

ありがとう!これを実装する最良の方法は何でしょうか?現在、私は 'var isMatch = matches(selectedIds、idList);'を実行して、それをコンソールに出力しています。それは私が推測している[0]を返します。また、[0、1]または[0、1、2]のいずれかを返します。 – jyoseph

+0

ファンクションに同じ名前を使用することについては気をつけてください。 – Eric

+0

ファイヤーバグから得たものの生の出力は次のとおりです。 http://pastebin.com/raw.php?i=9py2Yn2v – jyoseph

0

各配列を並べ替えて開始した場合は、各リストを1回だけトラバースする必要があります。

0

XのIDの1つが見つかったときに変数をインクリメントし、最後に到達したときに選択されたIDの合計と一致させる方法について説明します。 4つのうち4つが見つかった場合は、一致するものがあります

2

これを行う最も速く最も再利用可能な方法は、isSubset関数を作成することです。あなたはjQueryにも依存していません!今

function isSubset(largeSet, smallSet){ 

    for(var i=0; i<smallSet.length; i++){ 
     if(largeSet.indexOf(smallSet[i]) == -1){ 
      //not found. 
      return false; 
     } 
    } 

    return true; 
} 

すべてのIDのリストアレイを反復して、選択されたIDの配列を渡す:

isSubset(idList, selectedIds); 

上記trueを返した場合は、有効なリストを確認しています!

=============

編集:のindexOf(と脆弱性を指摘してエリックのおかげで、)。

次のコードは、すべてのブラウザでその問題を解決する必要があります。

if (!Array.indexOf) { 
    Array.prototype.indexOf = function (obj, start) { 
    for (var i = (start || 0); i < this.length; i++) { 
     if (this[i] == obj) { 
     return i; 
     } 
    } 
    return -1; 
    } 
} 
+3

[IEの 'Array.indexOf()'のサポートに注意してください(http://stellapower.net/content/javascript-support-and-arrayindexof-ie)... – Eric

+0

ありがとう!今これを試して... – jyoseph

関連する問題