Сравнение чисел в массиве

В массиве идут числа от 0 до бесконечности. Я проверяю массив на это соответствие. Если получится, что элемент массива больше чем хотя бы на 1 от предыдущего, то предыдущем я должен добавить 1. У меня все условия проходит, кроме одного. Что хотели получить 4, а получили 5. Вот мой код, что в нем подкорректировать:

console.log(nextId([0,1,2,3,5])); //4
console.log(nextId([0,1,2,3,4,5,6,7,8,9,10])); //11
console.log(nextId([0,1,2,3,4,5, 7,8, 10])); //6
console.log(nextId([1,2,3,4,5, 7,8, 10])); //0
console.log(nextId([0, 0, 2, 3, 3, 3, 5])); //1
console.log(nextId([0, 1, 2, 4, 5])); //3

function nextId(ids){

  function compareNum(a, b) {
    return a - b;
  }

  ids.sort(compareNum);

  let num = ids.length;

  for(let i = 0; i < ids.length; i++) {
    
    if(ids[0] != 0) {
      num = 0;
    } else if ((ids[i + 1] - ids[i]) >= 2){
      num = ids[i] + 1;
      break;
    }
  }
  return num;
}


Ответы (1 шт):

Автор решения: OPTIMUS PRIME

Только в одном случае вместо 4 выводится 5

Во: [0,1,2,3,3], это из-за того, что цикл идет до ids.length
И на последней итерации ids[i + 1] возвращает undefined, получается if (NaN >= 2)

console.log(nextId([0,1,2,3,3]));
console.log(nextId([0,1,2,3,5])); //4
console.log(nextId([0,1,2,3,4,5,6,7,8,9,10])); //11
console.log(nextId([0,1,2,3,4,5, 7,8, 10])); //6
console.log(nextId([1,2,3,4,5, 7,8, 10])); //0
console.log(nextId([0, 0, 2, 3, 3, 3, 5])); //1
console.log(nextId([0, 1, 2, 4, 5])); //3

function nextId(ids){
  ids.sort((a,b) => a - b);
  
  if (ids[0] != 0) return 0;

  for(let i = 0; i < ids.length - 1; i++) {
    if (ids[i + 1] - ids[i] >= 2) return ids[i] + 1;
  }
  
  return ids[ ids.length - 1 ] + 1;
}

→ Ссылка