什么是相当于C#HashSet的JavaScript?

Jon*_*len 58 javascript jquery hashset

我有几千个整数键的列表.我需要对此列表执行的唯一操作是说明给定值是否在列表中.

对于C#,我会用a HashSet来快速查找.什么是JavaScript等价物?


最低支持级别:IE 9 +,jQuery(当前)

Lex*_*obs 63

在引擎盖下,JavaScript对象使用哈希表实现.所以,你的Key:Value配对会是(your integer):true

恒定时间查找功能可以实现为:

var hash = {
  1:true,
  2:true,
  7:true
  //etc...
};

var checkValue = function(value){
  return hash[value] === true;
};


checkValue(7); // => true
checkValue(3); // => false
Run Code Online (Sandbox Code Playgroud)

  • [ECMAScript规范](http://www.ecma-international.org/ecma-262/6.0/#sec-set-has)清楚地将Set.has()函数定义为遍历整个Set,直到匹配为止找到.这似乎不符合OP在其他语言中使用HashSet的_fast lookup_的既定目标. (4认同)
  • @JDSandifer:同一规范还指出:“ Set对象必须使用哈希表或其他机制来实现,这些机制平均而言提供的访问时间对集合中元素的数量而言是次线性的。此Set对象中使用的数据结构该规范仅旨在描述Set对象所需的可观察的语义,而并非旨在成为可行的实现模型。” 在现代JavaScript中,当需要集合或地图时,最好使用Set和Map。 (4认同)
  • 真好 但是,还需要注意一件事,如果您想进行** _ for(哈希中的num)_ **迭代,则此处的num(存储为键)是字符串类型。 (3认同)
  • javascript中有一个Set对象,可以更好地满足此人的需求。 (3认同)

小智 58

实际上JavaScript提供了一个Set对象,使用起来非常简单:

var set = new Set();
set.add(1);
set.add(2);

set.has(1)    // true
Run Code Online (Sandbox Code Playgroud)

不幸的是,它与IE9不兼容.

  • 这应该是2018年的首选答案. (8认同)
  • IE9兼容性问题?安息吧 IE。 (3认同)
  • @LexJacobs:阅读该规范中 Set 对象的介绍。实现*要求*具有比 O(n) 更快的查找,实际上这意味着 O(log n) 或 O(1)。 (2认同)
  • 当使用 `.has()` 检查值是否存在时,Set 的性能***O(n)*** 比 Map ***O(1)*** 差。[参见这个答案](/sf/answers/5116215821/) (2认同)

Bar*_*mar 31

使用对象.要为集合添加密钥,请执行以下操作:

object[key] = true;
Run Code Online (Sandbox Code Playgroud)

要测试密钥是否在集合中,请执行以下操作:

if (object.hasOwnProperty(key)) { ... }
Run Code Online (Sandbox Code Playgroud)

要从集合中删除密钥,请执行以下操作:

delete object[key]
Run Code Online (Sandbox Code Playgroud)

  • hasOwnProperty很慢,如果有一个名为hasOwnProperty的键怎么办?使用o = Object.create(null); 创建"hashset"而不是文字然后你可以使用快速属性访问来检查密钥成员资格而不是方法hasOwnProperty(),而不必担心任何属性冲突. (4认同)
  • 测试一个键是否在集合中的正确方法是使用`object.hasOwnProperty(key)`.否则,object == true`中的"toString". (3认同)
  • `未设置`?JS中的操作符是`delete`! (2认同)

Tyl*_*nis 7

您可以只使用常规JavaScript对象和'in'关键字来查看该对象是否具有某个键.

var myObj = {
  name: true,
  age: true
}

'name' in myObj //returns true;
'height' in myObj // returns false;
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道您将在对象中创建可能在JavaScript对象属性中构建的键,请使用...

var myObj = {
  name: true,
  age: true
}

myObj.hasOwnProperty('name') //returns true;
myObj.hasOwnProperty('height') // returns false;
Run Code Online (Sandbox Code Playgroud)

  • 然后你重新评估你的生活. (23认同)
  • 如果有一个名为"hasOwnProperty"的键怎么办? (2认同)