何时在javaScript中使用set

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().(说浏览器兼容性)?

任何建议都有帮助.

m.s*_*tos 5

您将在MDN-Set上找到更多详细信息和浏览器兼容性。对于 Set 的一般实现,您可以阅读Wikipedia 上的Set - Implementations

描述为“一般用”实现通常努力优化element_ofadddelete操作。

您还可以在 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/