用于快速查找和有序循环的Javascript数据结构?

Hae*_*aes 20 javascript loops object-literal

Javascript中是否有数据结构或模式可用于快速查找(通过键,如关联数组)和有序循环?

是的,现在我使用对象文字存储我的数据,但我发现Chrome在循环遍历属性名称时没有维护顺序.

有没有一种常见的方法来解决这个问题?

谢谢你的任何提示.

Anu*_*rag 34

自己创建一个数据结构.将排序存储在结构内部的数组中.将键映射的对象存储在常规对象中.让我们称它为OrderedMap一个地图,一个数组和四个基本方法.

OrderedMap
    map
    _array

    set(key, value)
    get(key)
    remove(key)
    forEach(fn)

function OrderedMap() {
    this.map = {};
    this._array = [];
}
Run Code Online (Sandbox Code Playgroud)

插入元素时,将其添加到所需位置的数组以及对象.按索引或在末尾插入是O(1).

OrderedMap.prototype.set = function(key, value) {
    // key already exists, replace value
    if(key in this.map) {
        this.map[key] = value;
    }
    // insert new key and value
    else {
        this._array.push(key);
        this.map[key] = value;
    }
};
Run Code Online (Sandbox Code Playgroud)

删除对象时,将其从数组和对象中删除.如果通过键或值删除,复杂度为O(n),因为您需要遍历维护排序的内部数组.通过索引删除时,复杂度为O(1),因为您可以直接访问数组和对象中的值.

OrderedMap.prototype.remove = function(key) {
    var index = this._array.indexOf(key);
    if(index == -1) {
        throw new Error('key does not exist');
    }
    this._array.splice(index, 1);
    delete this.map[key];
};
Run Code Online (Sandbox Code Playgroud)

查找将在O(1)中.通过关联数组(对象)中的键检索值.

OrderedMap.prototype.get = function(key) {
    return this.map[key];
};
Run Code Online (Sandbox Code Playgroud)

Traversal将被订购,可以使用任何一种方法.当需要有序遍历时,创建一个包含对象的数组(仅限值)并返回它.作为一个数组,它不支持键控访问.另一个选项是要求客户端提供应该应用于数组中每个对象的回调函数.

OrderedMap.prototype.forEach = function(f) {
    var key, value;
    for(var i = 0; i < this._array.length; i++) {
        key = this._array[i];
        value = this.map[key];
        f(key, value);
    }
};
Run Code Online (Sandbox Code Playgroud)

请参阅Google 在Closure Library中对LinkedMap的实现,以获取此类的文档和来源.

  • 它必须遍历原型链的事实仍然没有使它成为O(n).想象一下4级深度的原型链层次结构,每个级别都维护一个哈希结构来保存键和值.然后它平均只需要4次这样的O(1)查找.那还是O(1).现在,据我所知,ECMAScript没有强制执行细节,所以有人可以在O(n²)中执行它,如果他们愿意的话.换句话说,它依赖于实现,但是考虑到大多数不错的实现,你可以期待平均O(1)查找. (4认同)
  • 您正在讨论两个变量.第一个是哈希映射中的项目数,第二个是原型链的深度.原型链的深度(在此特定方案中)是常量,并且不会随着哈希映射中项目数量的增加而增长.有了这个,请重新阅读我之前的陈述,现在对你来说都很有意义.如果没有,请查看此[文章](http://en.wikipedia.org/wiki/Big_O_notation). (3认同)