我只是 javaScript 的初学者,有 python 背景。我正在尝试这个练习来检查 string2 的每个字符是否都包含在 string1 中。
例如,如果 string1 是“hello”,如果 string2 是“leh”和 false
,我将返回 true
> 如果 string2 是“低”。
我想到的是这个:
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;
}
我也可以着手将 string2 转换为 Set
,然后取差值,即 set(string2) - set(string1)
的操作,这将获取我String2 中但不在 String1 中的一组字符,但我读到创建一组的成本很高,所以我没有继续。
我检查了其他解决方案,每个人都在使用 string1.indexOf(letter)
方法来检查 string2 中的每个字母是否都存在于 string1 中。
我想知道什么时候应该使用Set
差异。为什么每个人都在使用成本为 O(n) 的 array.indexOf()
方法而不是 O(1) 的 set.has()
方法。如果我使用 set.has()
有什么陷阱吗? (比如浏览器兼容性)?
任何建议都有帮助。
最佳答案
您将在 MDN - Set 上找到更多详细信息和浏览器兼容性.对于一般的 Set 实现,您可以阅读 Set - Implementations在维基百科上。
Implementations described as "general use" typically strive to optimize the
element_of
,add
, anddelete
operations.
您还可以在Array vs Set asnwer 上查看一些测试结果。在 Stack Overflow 上。
为了回答你的问题,虽然 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));
}
我对 100 万个随机创建的字符串调用了上述方法,得到了以下结果:
existsSet: 1.29s
existsString: 0.47s
对于实例化 Set
的方法来说,这几乎慢了三倍。
您可以找到我在以下 JsFiddle 上运行的测试:
关于javascript - 何时在 JavaScript 中使用 Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44936800/