获取Javascript中尚未使用的较低整数ID

时间:2013-10-23 16:56:40

标签: javascript

我有一个由整数ID定义的JS对象列表。

objects = [{
    id: 0,
    type: 'null'
}, {
    id: 1,
    type: 'foo'
}, {
    id: 2,
    type: 'bar'
}];

我实现了一个从列表中删除元素的函数:

removeObject = function(o){
    objects.splice(objects.indexOf(o), 1);
}

我的问题是我需要创建一个函数来在我的列表中添加一个尚未使用的id的新项(例如列表中没有的正整数)。

我尝试做类似的事情,但是当我移除对象0(例如)时它不起作用。

addObject = function(type){
    objects.push({
        id: objects.length,
        type: type
    });
};

我该怎么做?

编辑1

根据你的回答,我认为在性能方面最好的解决方案是使用topId,当我在列表中添加新对象时,它总是递增。

但这不符合我的要求。实际上我认为@ X-Pippes的反应可能会很好。

我应该这样做:

objects = [{
    id: 0,
    type: 'null'
}, {
    id: 1,
    type: 'foo'
}, {
    id: 2,
    type: 'bar'
}];

// Init available ids list with the default value
availableIds = [objects.length];

removeObject = function(o){
    // Remove the object from the list
    objects.splice(objects.indexOf(o), 1);
    // Add its id to the available ids list
    availableIds.push(o.id);
}

addObject = function(type){
    // Get lower id available
    var newId = Math.min.apply(Math,availableIds);
    // Push the new object with the id retrieved
    objects.push({
        id: newId,
        type: type
    });
    // Remove used id from the available ids list
    availableIds.splice(availableIds.indexOf(newId), 1);
    // Add a default id if available list is empty
    if(availableIds.length < 1) availableIds.push(objects.length);
};

5 个答案:

答案 0 :(得分:1)

使用正确的结构。 JavaScript object将完成这项工作。它保证你只获得一个项目的密钥,你可以查找并按键删除可能是O(1)ish。没有必要尝试以一种效率较低的方式重新实现它,这将是O(n)查找。

var structure = {
    objects : {},
    topId : 0
}

structure.add = function(item) {
    var id = this.topId ++;

    structure.objects[id] = item;
}

structure.add("thing")
structure.add("other thing")
structure.add("another thing")

structure.objects
>>> Object {0: "thing", 1: "other thing", 2: "another thing"}

structure.objects[1]
>> "other thing"

然后正常的索引操作得到/设置/删除。

如果您使用该功能,那么您的数据结构上有一个不变(保证),您将不会使用相同的ID两次。

答案 1 :(得分:1)

如果删除例如0并且下一个addObject为0,则必须执行以下操作:

  • 保留列表[初始为空]并删除每个ID。当您需要添加新的时,请选择较短的,添加和删除列表。
  • 同时保留添加了最大ID的var。如果前一个列表为空,则向var添加+1,使用该id添加addObject

答案 2 :(得分:0)

您需要一个功能才能找到第一个免费号码:

addObject = function(type){
    objects.push({
        id: firstOpenIndex(),
        type: type
    });
};

firstOpenIndex = function() {
    for(var idx = 0; true; i++) {
       var found = false;
       for(var o in objects) {
          if (objects[o].id == idx) {
             found = true;
             break;
          }
       }
       if (!found) return idx;
    }
}

答案 3 :(得分:0)

在Javascript中MaxInt是9007199254740992.为什么不继续增加?

答案 4 :(得分:0)

您可以并且可能应该只使用如下数组:

objects.type=['null','foo','bar'];

添加对象请参阅: How to append something to an array?

找到一个值:var index = objects.type.indexOf('foo');

找到第一个空字段var index = objects.type.indexOf('');,如果通过将元素设置为“”或“删除”元素,可以使用它来查找要添加的元素(如果index为-1,则使用objects.type.length) ...除非你有特定的理由保持“ID”静态(在这种情况下是数组索引),删除元素并只在末尾附加新的

删除元素请参阅: How do I remove a particular element from an array in JavaScript? 这将允许您只需推送/追加下一个数据。

如果您需要一个包含空字段的新对象数组,因为您需要跟踪新数据:

object.newField=new Array(objects.type.length);

如果到达对象包含多个数组的位置,您可能需要为insert / add和delete / remove创建函数,因此不要对1执行操作而不执行另一个操作。

所有内容都已内置(可能已经非常快),您不需要为真正酷的对象类型重新构建构造函数。