我有5个字符组合的数组(组合中的顺序不起作用):
AB,ABDE,CDE,C,BE ......
在此基础上,我需要验证用户的输入。输入的字符组合应包含在数组的一个组合中。
如果用户输入" ADE"或者" CE"结果应为yes
,例如" BCE" - no
。
在一个简单的例子中,当输入的组合只匹配数组中的那个时,我可以使用.inArray
。如果输入的组合由邻居组成,我可以.indexOf
。如何在上面的情况下?
其中一个解决方案是通过包含所有可能的" child"来扩展初始数组。组合。还有其他选择吗?
答案 0 :(得分:1)
我能想到的第一件事就是用正则表达式匹配grep'ping数组。
var haystack = ["BCED","DBCE","CEB","ECBA","CB","BDCA"];
var needle = "CBE";
var re = new RegExp("(?=.*" + needle.split('').join(")(?=.*") + ").{" + needle.length+"}");
console.log(re);
console.log($.grep(haystack, function(str){
return str.match(re,"g");
}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 1 :(得分:1)
我将扩展我对上述问题所做的评论:如果您有少量固定集元素,则可以将这些集合表示为二进制掩码。所以说你把原始集合作为字符串:
var sset = ["AB", "ABDE", "CDE", "C", "BE"];
创建可能元素和位的字典。这些位是2的幂,可以通过位移创建:1 << n
是位n
:
dict = {
A: (1 << 0),
B: (1 << 1),
C: (1 << 2),
D: (1 << 3),
E: (1 << 4),
};
然后可以使用该字典创建位掩码:
function bitmask(s, d) {
let res = 0;
for (let i = 0; i < s.length; i++) {
res |= d[s[i]]
}
return res;
}
为包含蒙版的集创建伴随阵列:
var mset = sset.map(function(x) { return bitmask(x, dict); });
如果要检查输入,请先将其转换为遮罩,然后再运行检查。如果s
:
x
包含输入(s & x) == x
的所有位
var s = "ADE";
var m = bitmask(s, dict);
for (let i = 0; i < mset.length; i++) {
console.log(sset[i], s, (mset[i] & m) == m);
}
您可以将此策略用于以下几种情况:
•(a & b) == b
- b
的所有元素都包含在a
中;
•(a & b) == 0
- a
和b
没有共同元素;
•(a & b) != 0
- b
中至少有一个元素位于a
;
•a == b
- 集a
和b
相同。
在集合用语中a & b
是交集,a | b
是联合,a ^ b
是a
和b
的对称差异。
据我所知,jQuery是一个用Javascript编写的库,所以所有按位运算符都应该可用。