2017-10-19 68 views
0

我有5个字符组合的阵列(顺序的组合内起着无作用):JavaScript - 有没有办法找出给定的字符是否包含在没有循环的字符串中?

AB,ABDE,CDE,C,BE ...

在其基础我需要验证输入来自用户。输入的字符组合应包含在数组的其中一个组合中。 如果用户输入“ADE”或“CE”,结果应该是yes,例如, “BCE” - no

在一个微不足道的情况下,当输入组合简单地匹配数组中的一个时,我可以使用.inArray。如果输入的组合由邻居组成,我可以做.indexOf。如何在上面的情况? 其中一个解决方案是通过包含所有可能的“子”组合来扩展初始数组。有其他选择吗?

+0

不确定逻辑是什么? “当输入的组合与数组中的数字简单匹配时”的预期结果是什么? – guest271314

+0

如果输入的组合是数组,则结果为正数,输入有效,是。这就是我所说的一个微不足道的情况。 –

+0

你的意思是如果输入“AB”和“D”,结果应该是“yes”?作为一个匹配在数组中找到?目前还不清楚预期的输入,匹配逻辑或结果是什么。你能否包含你试图通过问题解决问题的代码?请参阅https://stackoverflow.com/help/mcve – guest271314

回答

1

我能想到的第一件事是用正则表达式匹配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>

1

我会扩大我上面的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) == 0ab没有共同的元素;
(a & b) != 0b的至少一个元素在a;
a == b —套ab是相同的。

在集用语a & b是交叉点,a | b是工会和a^bab对称差。

据我所知,jQuery是一个使用Javascript编写的库,所以所有按位运算符都应该可用。

相关问题