Abh*_*ava 5 javascript arrays set indexof
我只是javaScript的初学者,拥有python的背景.我正在尝试这个练习来检查string2的每个字符是否都包含在string1中.例如,如果STRING1是"你好",我会回来true,如果字符串2是"列城"的false,如果字符串2为"低".
我提出的是这个:
function mutation(arr) {
var set = new Set(string1.split(''));
for (var i = 0; i < string2.length; i++)
if (!set.has(string2[i]))
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我还可以去转换字符串2为一组,然后就采取即操作的差异set(string2) - set(string1),这将取我的一组是包含字符串,但不是在字符串1个字符,但我读创建一组是昂贵的,所以我没有去先.
我检查了其他解决方案,每个人都在使用string1.indexOf(letter)方法来检查string2中的每个字母是否都在string1中.
我想知道什么时候应该使用一组差异.为什么每个人都在使用array.indexOf()花费O(n)而不是set.has()O(1)的方法的方法.如果我正在使用,是否有任何陷阱set.has().(说浏览器兼容性)?
任何建议都有帮助.
您将在MDN-Set上找到更多详细信息和浏览器兼容性。对于 Set 的一般实现,您可以阅读Wikipedia 上的Set - Implementations。
描述为“一般用”实现通常努力优化
element_of,add和delete操作。
您还可以在 Stack Overflow上查看Array vs Set asnwer上的一些测试结果。
为了回答您的问题,尽管has操作可能比使用 String 的indexOf(或includes)快一点,但在您的特定情况下,Set为每个比较实例化一个新的成本要高得多。
我使用以下两种方法创建了一个简单的测试:
function existsSet(str1, str2) {
const set = new Set(str1);
return ![...str2].some(char => !set.has(char));
}
function existsString(str1, str2) {
return ![...str2].some(char => !str1.includes(char));
}
Run Code Online (Sandbox Code Playgroud)
我为 100 万个随机创建的字符串调用了上述方法,得到以下结果:
existsSet: 1.29s
existsString: 0.47s
Run Code Online (Sandbox Code Playgroud)
对于实例化 a 的方法来说,这几乎慢了三倍Set。
您可以在以下 JsFiddle 上找到我运行的测试:
https://jsfiddle.net/mspyratos/zwx3zcx1/11/