Javascript 在对象数组中查找下一个可用id
我有一个对象数组。这些对象有一个属性id。我需要一个返回下一个可用id(对象未使用)的函数 数组=[ { 身份证号码:1 }, { 身份证号码:2 }, { 身份证号码:5 }, { 身份证号码:3 } ] 我希望有一个函数,它接受一个数组作为输入,并返回一个数字(这是下一个可用id) 在示例中: findFreeId(数组){ 奇迹发生了 }Javascript 在对象数组中查找下一个可用id,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组。这些对象有一个属性id。我需要一个返回下一个可用id(对象未使用)的函数 数组=[ { 身份证号码:1 }, { 身份证号码:2 }, { 身份证号码:5 }, { 身份证号码:3 } ] 我希望有一个函数,它接受一个数组作为输入,并返回一个数字(这是下一个可用id) 在示例中: findFreeId(数组){ 奇迹发生了 } 结果-->4像这样的东西怎么样 函数findFreeId(数组){ 常量数组=数组 .slice()//制作数组的副本。 .sort(函数(a,b){
结果-->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开始查找序列中缺少的第一个数字。在效率无关紧要的情况下,这可能没问题,但更有效的方法是:
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将每次调用中用于…的数组中的每个元素进行复制、排序和循环进行比较?在这种情况下?绝对如此。但我敢肯定,你太自鸣得意了,看不出你的方法有什么问题,从你的语气中可以明显看出。祝你好运。