我在JavaScript工作。我想存储一个唯一的,无序的字符串值列表,具有以下属性:
问“a在名单中吗?” 一种快速的方法来做“从列表中删除a,如果它存在于列表” 一个快速的方法来做“添加a到列表中,如果它还没有出现”。
我真正想要的是一套。在JavaScript中模仿集合的最佳方法有什么建议吗?
这个问题建议使用一个对象,键存储属性,值全部设置为true:这是明智的方式吗?
我在JavaScript工作。我想存储一个唯一的,无序的字符串值列表,具有以下属性:
问“a在名单中吗?” 一种快速的方法来做“从列表中删除a,如果它存在于列表” 一个快速的方法来做“添加a到列表中,如果它还没有出现”。
我真正想要的是一套。在JavaScript中模仿集合的最佳方法有什么建议吗?
这个问题建议使用一个对象,键存储属性,值全部设置为true:这是明智的方式吗?
当前回答
在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,它只允许添加对象类型的值。
其他回答
在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,它只允许添加对象类型的值。
我刚刚注意到d3.js库有集,映射和其他数据结构的实现。 我不能争辩他们的效率,但从这是一个受欢迎的图书馆的事实来看,它一定是你需要的。
文档在这里
为了方便,我从链接中复制(前3个函数是那些感兴趣的)
d3.set([]数组)
构造一个新集合。如果指定了array,则将给定的字符串值数组添加到返回集。
set.has(值)
当且仅当此集合有指定值字符串的条目时返回true。
set.add(值)
将指定的值字符串添加到此集。
set.remove(值)
如果集合包含指定的值字符串,则删除它并返回true。否则,该方法不执行任何操作并返回false。
set.values ()
返回此集合中字符串值的数组。返回值的顺序是任意的。可以作为计算一组字符串的唯一值的方便方法。例如:
d3。Set (["foo", "bar", "foo", "baz"]).values();// "foo", "bar", "baz"
set.forEach(函数)
为此集中的每个值调用指定的函数,并将值作为参数传递。函数的上下文是这个集合。返回未定义。迭代顺序是任意的。
set.empty ()
当且仅当此集合为零值时返回true。
set.size ()
返回此集合中值的数目。
你可以创建一个没有类似属性的对象
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
从ECMAScript 6开始,Set数据结构是一个内置特性。与node.js版本的兼容性可以在这里找到。
我已经开始了一个集的实现,目前工作得很好与数字和字符串。我主要关注的是差值运算,所以我尽可能地提高它的效率。fork和代码审查是受欢迎的!
https://github.com/mcrisc/SetJS