我有一个我正在处理的特殊问题。我会开始含糊不清,如果有人需要更多细节,我可以给出项目背景。
我有一个选定的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
}
});
答案 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个,则匹配