Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在对象数组中查找下一个可用id_Javascript_Arrays_Object - Fatal编程技术网

Javascript 在对象数组中查找下一个可用id

Javascript 在对象数组中查找下一个可用id,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组。这些对象有一个属性id。我需要一个返回下一个可用id(对象未使用)的函数 数组=[ { 身份证号码:1 }, { 身份证号码:2 }, { 身份证号码:5 }, { 身份证号码:3 } ] 我希望有一个函数,它接受一个数组作为输入,并返回一个数字(这是下一个可用id) 在示例中: findFreeId(数组){ 奇迹发生了 } 结果-->4像这样的东西怎么样 函数findFreeId(数组){ 常量数组=数组 .slice()//制作数组的副本。 .sort(函数(a,b){

我有一个对象数组。这些对象有一个属性id。我需要一个返回下一个可用id(对象未使用)的函数

数组=[ { 身份证号码:1 }, { 身份证号码:2 }, { 身份证号码:5 }, { 身份证号码:3 } ]

我希望有一个函数,它接受一个数组作为输入,并返回一个数字(这是下一个可用id)

在示例中:

findFreeId(数组){ 奇迹发生了 }


结果-->4

像这样的东西怎么样

函数findFreeId(数组){
常量数组=数组
.slice()//制作数组的副本。
.sort(函数(a,b){返回a.id-b.id});//对其进行排序。
设previousId=0;
for(let SorterDarray元素){
if(element.id!=(先前的id+1)){
//找到了一个缺口。
返回上一个ID+1;
}
previousId=element.id;
}
//没有发现任何缺口。
返回上一个ID+1;
}
//测试。
设withGap=[{id:1},{id:2},{id:5},{id:3}];
设noGap=[{id:1},{id:2}];
设为空=[];
console.log(findFreeId(withGap));//4.
console.log(findFreeId(noGap));//3.

console.log(findFreeId(空));//1
一种简单的方法是获取所有ID值,对它们进行排序,然后从0开始查找序列中缺少的第一个数字。在效率无关紧要的情况下,这可能没问题,但更有效的方法是:

  • 拿到身份证
  • 分类
  • 单步遍历这些值以获得下一个可用数字
  • 在ID列表中插入该值
  • 存储该值,以便下次从上一个值+1的#3开始
  • 例如

    class-IDStore{
    构造函数(数据数组){
    如果(!Array.isArray(dataArray)){
    返回null;
    }
    此.previousIndex=0;
    this.index=dataArray.map(obj=>obj.id).sort();
    }
    获取nextIndex(){
    while(this.index[this.previousIndex]==this.previousIndex){
    这个.previousIndex++;
    }
    返回此.previousIndex;
    }
    addIndex(索引){
    if(!Number.isInteger(index)| this.index.find[index]){
    返回null;
    }
    this.index.push(index);
    this.index.sort();
    收益指数;
    }
    }
    var data=[{id:1},{id:2},{id:5},{id:3}];
    //创建一个ID存储
    var idStore=新的idStore(数据);
    //在数组中插入更多具有唯一ID的对象
    
    对于(var i=0,下一步;i我可以询问id字段的用途以及为什么需要它填充空格?代码-仅答案没有特别的帮助。您应该解释OP代码中的问题以及您的答案如何解决这些问题。for(const element of…)
    与semantic相反,它是一个常量,在每次迭代中都有不同的值。我不明白为什么整个数组都需要排序,而只有ID才有意义。@RobG我尊重地不同意你的大多数陈述。OP没有提交任何代码进行评论,他在寻找解决方案。此外,代码编写良好这是不言自明的,总是比一堵文本墙更可取。对ID或完整对象数组进行排序绝对不会造成性能损失,那么为什么要降低代码的可读性呢?最后,我同意for循环中的
    const
    是一个错误,谢谢你提出这个问题。谢谢@MorganWilde,你的解决方案正是我想要的我真的很感谢你分享这个!我希望你有一个美好的一天,好先生!“过早优化是万恶之源”,一位智者曾经说过…@MorganWilde将每次调用中用于…的数组中的每个元素进行复制、排序和循环进行比较?在这种情况下?绝对如此。但我敢肯定,你太自鸣得意了,看不出你的方法有什么问题,从你的语气中可以明显看出。祝你好运。