一个高效的Javascript集合结构

在阅读了许多类似的问题后

  • 设置数据结构的JavaScript实现
  • 模仿JavaScript中的集?
  • 节点JS,传统的数据结构? (如设置等),像Java.util节点?
  • 高效的Javascript数组查找
  • find一个项目是否在JavaScript数组中的最佳方法?
  • 如何检查数组是否包含JavaScript中的对象?

我仍然有一个问题:假设我有大量的string(数千),我不得不做很多查找(即多次检查给定的string是否包含在此数组中)。 什么是Node.js中最有效的方法?

A.sortingstring数组,然后使用二进制search? 要么:

B.将string转换为对象的键,然后使用“in”运算符

我知道A的复杂性是O(log N),其中N是string的数量。

但是我不知道B的复杂性

如果一个JavaScript对象被实现为一个哈希表,那么B的复杂度平均而言是O(1),这比A好。但是,我不知道一个Javascript对象是否真的被实现为一个哈希表!

对于固定的大型string数组,我build议使用某种forms的基数search另外,看看这个包中不同的数据结构和algorithm(AVL树,队列/堆等)

我很确定使用JS对象作为string的存储将导致该对象的“散列模式”。 取决于实现,这可以是O(log n)到O(1)时间。 看看一些 jsperf 基准testing比较属性查找与二进制searchsorting数组。

实际上,特别是如果我不打算在浏览器中使用代码,我会将这个function卸载到redis或memcached之类的东西上。

2016年更新

既然你在问关于node.js的问题,那么现在你可以使用ES6中的Set或者Map对象,因为它们是内置在ES6中的。 两者都允许你使用任何string作为关键。 Set对象是适当的,当你只想看看这个键是否存在于:

 if (mySet.has(someString)) { //code here } 

而且,如果要为该密钥存储值, Map就是合适的,如下所示:

 if (myMap.has(someString)) { let val = myMap[someString]; // do something with val here } 

现在,两个ES6function都已经内置到节点V4的node.js中(此编辑的当前版本的node.js是v6)。

较老的答案

所有重要的性能问题都应该在jsperf.com这样的工具中用实际的性能testing进行testing。 在你的情况下,一个javascript对象使用哈希表类似的实现,因为没有什么performance相当不错,整个实现会很慢,因为如此多的JavaScript使用对象。

对象上的string键将是我要testing的第一个东西,并且是我对最佳表演者的猜测。 由于一个对象的内部是用本地代码实现的,所以我认为这比在javascript中实现的哈希表或二进制search更快。

但是,当我开始回答的时候,你应该用一个像jsperf这样的工具来testing你最关心的string的数量和长度。