gpt4 book ai didi

javascript - 何时在 JavaScript 中使用 Set

转载 作者:数据小太阳 更新时间:2023-10-29 06:14:37 25 4
gpt4 key购买 nike

我只是 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, and delete 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 上运行的测试:

https://jsfiddle.net/mspyratos/zwx3zcx1/11/

关于javascript - 何时在 JavaScript 中使用 Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44936800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com