javascript - 何时在 JavaScript 中使用 Set

标签 javascript arrays set indexof

我只是 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/

相关文章:

javascript - $scope变量不断变化

javascript - 信用卡以逗号分隔 - 正则表达式 - Javascript

javascript - 如何为 chrome 中的(python) Selenium 测试禁用 "Reload site? Changes you made may not be saved"弹出窗口?

java - 二维数组 | java

c# - 如何在 C# 中使用 3 个数组分配变量

javascript - 在 javascript 代码中排列多个类

php - 按列中的子数组对数据行进行分组,并创建具有可变深度的子集

python - 计算交叉点的更有效方法?

python - 为什么Python中排序列表转换为集合后元素顺序会发生变化?

java - 集合的 "toArray"是确定性的吗?