Найти следующий доступный идентификатор в массиве объектов - PullRequest
0 голосов
/ 25 января 2019

У меня есть массив объектов. Эти объекты имеют идентификатор свойства. Мне нужна функция, которая возвращает следующий доступный идентификатор (который не используется объектом).

массив = [ { id: 1 }, { id: 2 }, { id: 5 }, { id: 3 } ]

Я хотел бы иметь функцию, которая принимает массив в качестве входных данных и возвращает число (которое является следующим свободным идентификатором).

В примере:

findFreeId (массив) { магия случается }

результат -> 4

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Простой подход состоит в том, чтобы получить все значения идентификаторов, отсортировать их, а затем, начиная с 0, искать первое пропущенное число в последовательности. Это может быть хорошо, если эффективность не имеет значения, но более эффективный метод:

  1. Получить идентификаторы
  2. Сортировать их
  3. Пройдите по значениям, чтобы получить следующий доступный номер
  4. Вставить значение в список идентификаторов
  5. Сохранить значение, чтобы в следующий раз оно начиналось с # 3 по сравнению с предыдущим значением + 1

например.

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));

Это несколько упрощенно, поскольку предполагается, что идентификаторы являются последовательными целыми числами, начинающимися с 0, и не требуют большой проверки или обработки ошибок.

Поддержание идентификатора отдельно от добавления новых членов в массив данных. Было бы гораздо лучше объединить операции, поэтому метод «добавить объект» получает следующий доступный идентификатор, добавляет его к объекту, добавляет объект в массив, обновляет индекс и возвращает новый идентификатор.

0 голосов
/ 25 января 2019

Как насчет этого?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...