我有一个对象数组。这些对象具有属性ID。我需要一个函数,该函数返回下一个可用的id(对象未使用)。
array = [ { 编号:1 }, { id:2 }, { 编号:5 }, { id:3 } ]
我想要一个函数,该函数将数组作为输入并返回一个数字(这是下一个空闲ID)。
在示例情况下:
findFreeId(array){ 发生魔术 }
结果-> 4
答案 0 :(得分:1)
这样的事情怎么样?
function findFreeId (array) {
const sortedArray = array
.slice() // Make a copy of the array.
.sort(function (a, b) {return a.id - b.id}); // Sort it.
let previousId = 0;
for (let element of sortedArray) {
if (element.id != (previousId + 1)) {
// Found a gap.
return previousId + 1;
}
previousId = element.id;
}
// Found no gaps.
return previousId + 1;
}
// Tests.
let withGap = [{id: 1}, {id: 2}, {id: 5}, {id: 3}];
let noGap = [{id: 1}, {id: 2}];
let empty = [];
console.log(findFreeId(withGap)); // 4
console.log(findFreeId(noGap)); // 3
console.log(findFreeId(empty)); // 1
答案 1 :(得分:0)
一种简单的方法是获取所有ID值,对它们进行排序,然后从0开始查找序列中的第一个缺失数字。在效率无关紧要的地方也许可以,但是更有效的方法是:
例如
class IDStore {
constructor(dataArray) {
if (!Array.isArray(dataArray)) {
return null;
}
this.previousIndex = 0;
this.indexes = dataArray.map(obj => obj.id).sort();
}
get nextIndex() {
while (this.indexes[this.previousIndex] == this.previousIndex) {
this.previousIndex++;
}
return this.previousIndex;
}
addIndex(index) {
if (!Number.isInteger(index) || this.indexes.find[index]) {
return null;
}
this.indexes.push(index);
this.indexes.sort();
return index;
}
}
var data = [ { id: 1 }, { id: 2 }, { id: 5 }, { id: 3 } ];
// Create an ID store
var idStore = new IDStore(data);
// Insert more objects in the array with unique IDs
for (var i=0, next; i<4; i++) {
// Current list of indexes
console.log('Indexes: ' + idStore.indexes);
// Get the next available index
next = idStore.nextIndex;
console.log('Next available: ' + next);
// Calling nextIndex doesn't affect next index
next = idStore.nextIndex;
console.log('Next available: ' + next);
// Use next index
data.push({id: next});
// Adding next index is manual
idStore.addIndex(next);
console.log('Added: ' + next);
}
// Data structure is independent
console.log('End: ' + JSON.stringify(data));
这有点简单,因为它假定ID是从0开始的连续整数,并且没有太多的验证或错误处理。
维护ID与向数据数组添加新成员是分开的。合并这些操作会更好,因此,“添加对象”方法将获取下一个可用ID,将其添加到对象,将对象添加到数组,更新索引并返回新ID。