我在JavaScript工作。我想存储一个唯一的,无序的字符串值列表,具有以下属性:

问“a在名单中吗?” 一种快速的方法来做“从列表中删除a,如果它存在于列表” 一个快速的方法来做“添加a到列表中,如果它还没有出现”。

我真正想要的是一套。在JavaScript中模仿集合的最佳方法有什么建议吗?

这个问题建议使用一个对象,键存储属性,值全部设置为true:这是明智的方式吗?


当前回答

是的,这是一种明智的方式——对象就是这样(在这个用例中)——一堆可以直接访问的键/值。

在添加它之前,你需要检查它是否已经在那里,或者如果你只需要表示存在,“添加”它实际上不会改变任何东西,它只是再次将它设置在对象上。

其他回答

我已经开始了一个集的实现,目前工作得很好与数字和字符串。我主要关注的是差值运算,所以我尽可能地提高它的效率。fork和代码审查是受欢迎的!

https://github.com/mcrisc/SetJS

是的,这是一种明智的方式——对象就是这样(在这个用例中)——一堆可以直接访问的键/值。

在添加它之前,你需要检查它是否已经在那里,或者如果你只需要表示存在,“添加”它实际上不会改变任何东西,它只是再次将它设置在对象上。

你可以创建一个没有类似属性的对象

var set = Object.create(null)

它可以作为一个集合,并消除了使用hasOwnProperty的需要。


var set = Object.create(null); // create an object with no properties

if (A in set) { // 1. is A in the list
  // some code
}
delete set[a]; // 2. delete A from the list if it exists in the list 
set[A] = true; // 3. add A to the list if it is not already present

在ES6版本的Javascript中,你已经内置了type for set(检查与浏览器的兼容性)。

var numbers = new Set([1, 2, 4]); // Set {1, 2, 4}

要向set中添加一个元素,只需使用.add(),它在O(1)中运行,并将元素添加到set中(如果它不存在),或者如果它已经存在,则不执行任何操作。你可以添加任何类型的元素(数组,字符串,数字)

numbers.add(4); // Set {1, 2, 4}
numbers.add(6); // Set {1, 2, 4, 6}

要检查集合中元素的数量,可以简单地使用.size。也在O(1)中运行

numbers.size; // 4

使用.delete()从集合中删除元素。如果值存在(并且已被删除),则返回true,如果值不存在则返回false。也运行在O(1)。

numbers.delete(2); // true
numbers.delete(2); // false

要检查元素是否存在于集合中,请使用.has(),如果元素在集合中则返回true,否则返回false。也运行在O(1)。

numbers.has(3); // false
numbers.has(1); // true

除了你想要的方法之外,还有一些额外的方法:

numbers.clear ();会从集合中移除所有元素吗 numbers.forEach(回调);按插入顺序遍历集合的值 numbers.entries ();创建所有值的迭代器 numbers.keys ();返回与numbers相同的集合的键。values()


还有一个Weakset,它只允许添加对象类型的值。

从ECMAScript 6开始,Set数据结构是一个内置特性。与node.js版本的兼容性可以在这里找到。