0

我正在构建一个基本的 MinArray,即一个数组包装器,它将已删除的 id 推送到队列中,并在增加长度之前重用回收的 id;

但是,我的 MinArray 不会回收 id,它只是不断增加。

完整的代码和测试可以在这个fiddle找到。

此代码插入一个新值并返回分配的 id:

MinArray.prototype.insert = function(val){
    var id;
    var recycledId = this._recycledIds.shift();
    if(recycledId){
        id = recycledId;
    }else{
        id = this._nextId++;
    }
    this._vals[id] = val;
    this._executeCallbacks(this.oninsert, this._vals[id]);
    this.length++;
    return id;
};

这段代码从数组中删除一个项目:

MinArray.prototype.remove = function(id){
    if(this._vals[id]){
        this._executeCallbacks(this.onremove, this._vals[id]);
        delete this._vals[id];
        this._recycledIds.push(id);
        this.length--;
        return true;
    }else{
        return false;
    }
};

或者,您知道我可以自由使用的任何好的现有实现吗?

4

2 回答 2

1

解决方案非常简单:

MinArray.prototype.insert = function(val){
    var id;
    var recycledId = this._recycledIds.shift();
    if(typeof recycledId === 'number'){ // <<<<<
        id = recycledId;
    }else{
        id = this._nextId++;
    }
    this._vals[id] = val;
    this._executeCallbacks(this.oninsert, this._vals[id]);
    this.length++;
    return id;
};
于 2013-04-07T10:48:12.897 回答
1

更改if(recycledId){ 为,if(recycledId !== undefined){ 因为你写零的方式也是错误的 - 虽然它应该是正确的工作

编辑:函数中也存在相同的错误remove- 如果您的 _vals[id] 包含零(或假或空字符串),它将不会被删除。更好地更改if(this._vals[id]){if(this._vals[id] !== undefined){ 提醒开发人员 MinArray 不能包含“未定义”值作为数据。

于 2013-04-07T10:48:45.933 回答