重复检查与创建一套打字稿

Duplicate Checking vs Creating a set typescript

有点基本的问题,在遍历对象数组时,我需要建立一个唯一字符串列表,在循环中添加一个 if 语句会比创建一个集合更好吗?

if (!arr.includes(newString)) arr.push(newString)

VS 推所有字符串然后

arr = [ ...new Set(arr) ]

Set 多, 快。

让我们在 jsbench.me

上做个测试

设置:

让我们创建一个包含数字 0-9999 的数组,然后为 20,000 个项目再次创建 0-9999,每个项目只有一个重复项。

const data = []
for (let i = 0; i < 10000; i++) data.push(i)
for (let i = 0; i < 10000; i++) data.push(i)

循环测试:

let arr = []
for (let n of data) {
  if (!arr.includes(n)) arr.push(n) 
}

每秒执行 9.72 次

设置测试:

let arr = [ ...new Set(data) ]

每秒执行 1422.54 次


Run the test yourself here

所以 Set 快 146 倍(在我的机器上)

我怀疑这是因为 Set 是用本机编译代码实现的,如果做得好,它的性能和效率是无与伦比的。你可以相信,内置的浏览器实现可能非常非常好。

此外,您可以采取任何措施来避免对大型数组进行循环,这对提高性能来说是一件好事。