JS

时间:2016-05-15 09:49:02

标签: javascript node.js set

我想要一个唯一的字符串列表,所以每当我得到一个新的字符串,我应该推到列表上时,我需要检查列表是否包含该项目,然后再将其推送到列表中。这似乎没有意义。

但是,如果我使用哈希结构并将项目存储为键,是否有某种方法可以使其比简单数组更高效?

我想我只是想知道JavaScript中存在最高性能的数据结构。

2 个答案:

答案 0 :(得分:2)

是的,使用Set将比检查现有值(对于数组的集合与O(n)为O(1))快得多。

var s = Set();

s.add(1); // s is (1)
s.add(2);
s.add(3);
s.add(1)
s.add(1)

// s is now (1, 2, 3)

答案 1 :(得分:2)

在现代浏览器(Chrome 38 +,IE11 +)中定义了Set类型,此处记录了它:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

否则,在JavaScript中,Object值(ECMAScript中的基本类型)在内部实现为哈希表 - 因此最快的概念“HashSet”结构将作为哈希表的一般化存在于忽视了价值型。

这是我如何做的(如果Set不可用):

function StringSet() {
    this.values = {};
    this.add = function(value) {
        value = value.toUpperCase(); // use UpperCase for string normalization because of how casing rules work in different languages, especially Turkish
        this.values[ value ] = true; // use bool values as stubs
    };
    this.contains = function(value) {
        value = value.toUpperCase();
        return value in this.values; // JavaScript has a fast `in` operator which runs in `O(1)` time
    }
}

var foo = new StringSet();
foo.add("bar");
assert( foo.contains("bar") );