jQuery / javascript在列表中查找值

时间:2010-12-01 19:36:15

标签: javascript jquery arrays list

我有一个我正在处理的特殊问题。我会开始含糊不清,如果有人需要更多细节,我可以给出项目背景。

我有一个选定的ID(从复选框中选择):161

我有很多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具有已选择的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"]

等等。可以选择1到5个或6个ID:["161", "306", "216", "668"]

有人能指出我正确的方向吗?我认为这基本上就像比较列表A中每个项目需要在列表B中找到的两个列表。


修改

我应该添加该行可以包含在所选列表中找不到的其他ID。因此,如果所选ID为["161", "306"],则["161", "165", "395", "306"]仍然匹配,即使它包含165和395。


修改

要更新并提供更多信息。我有一个单选按钮列表:

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

我有一个无序列表,每个列表都有一个数据属性(我正在使用元数据插件):

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

单击单选按钮时:

// 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
    }


});

4 个答案:

答案 0 :(得分: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函数。我将把剩下的答案留给上下文。

答案 1 :(得分: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,则表示您已找到有效列表!

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

编辑:感谢Eric,指出了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;
  }
}

答案 2 :(得分:0)

如果你开始排序每个数组,你只需要遍历每个列表一次。

答案 3 :(得分:0)

当找到一个X id时递增一个变量,并在它到达结尾时将它与总选择的Id匹配。如果找到了4个中的4个,则匹配