JavaScript - 有没有办法找出给定的字符是否包含在没有循环的字符串中?
问题描述:
我有5个字符组合的阵列(顺序的组合内起着无作用):JavaScript - 有没有办法找出给定的字符是否包含在没有循环的字符串中?
AB,ABDE,CDE,C,BE ...
在其基础我需要验证输入来自用户。输入的字符组合应包含在数组的其中一个组合中。 如果用户输入“ADE”或“CE”,结果应该是yes
,例如, “BCE” - no
。
在一个微不足道的情况下,当输入组合简单地匹配数组中的一个时,我可以使用.inArray
。如果输入的组合由邻居组成,我可以做.indexOf
。如何在上面的情况? 其中一个解决方案是通过包含所有可能的“子”组合来扩展初始数组。有其他选择吗?
答
我能想到的第一件事是用正则表达式匹配grep'数组。
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>
答
我会扩大我上面的quesion提出的意见:如果你有一个小数目固定的元素集合,可以代表组为二进制口罩。所以说你有原始的字符串集:
var sset = ["AB", "ABDE", "CDE", "C", "BE"];
创建一个可能的元素和位字典。位是两个,其可以通过比特移位来创建职权: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编写的库,所以所有按位运算符都应该可用。
不确定逻辑是什么? “当输入的组合与数组中的数字简单匹配时”的预期结果是什么? – guest271314
如果输入的组合是数组,则结果为正数,输入有效,是。这就是我所说的一个微不足道的情况。 –
你的意思是如果输入“AB”和“D”,结果应该是“yes”?作为一个匹配在数组中找到?目前还不清楚预期的输入,匹配逻辑或结果是什么。你能否包含你试图通过问题解决问题的代码?请参阅https://*.com/help/mcve – guest271314