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

时间:2019-01-24 23:07:10

标签: javascript arrays object id

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

array = [ {   编号:1 }, {   id:2 }, {   编号:5 }, {   id:3 } ]

我想要一个函数,该函数将数组作为输入并返回一个数字(这是下一个空闲ID)。

在示例情况下:

findFreeId(array){   发生魔术 }

结果-> 4

2 个答案:

答案 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开始查找序列中的第一个缺失数字。在效率无关紧要的地方也许可以,但是更有效的方法是:

  1. 获取ID
  2. 对它们进行排序
  3. 逐步浏览值以获取下一个可用号码
  4. 将值插入ID列表
  5. 存储该值,以便下一次从上一个值+ 1开始从#3开始

例如

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。