В чем причина ошибки "Uncaught RangeError: Invalid array length"?

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

merge([2,4,7,8], [1,3,5,6]) => [1,2,3,4,5,6,7,8], но как результат получаю выше упомянутую ошибку. Код выглядит следующим образом:

function merge(arr1, arr2) {
    let arr = []

    while(arr1[0] !== undefined || arr2[0] !== undefined) {
        if(arr1[0] < arr2[0]) {
            arr.push(arr1.shift())
        } else {
            arr.push(arr2.shift())
        }
    }

    if(arr1.length > 0) {
        arr.concat(arr1)
    } else {
        arr.concat(arr2)
    }

    return arr
}

Буду очень рад, если объясните мою ошибку)))


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

Автор решения: Sergey Glazirin

Ошибка заключается в том, что когда доходим до состояния

arr1 = (2) [7, 8], arr2 = []

Заходим в цикл, так как один из массивов не пустой

дальше идет сравнение

if(arr1[0] < arr2[0])

идем по пути false. Где пытается сделать shift() от пустого массива, получаем udefined.

По сути цикл становится вечным, до тех пор пока движок JS-а не выдаст ошибку.

Как вариант, можно переписать решение задачи так:

const array1 = [2, 4, 7, 8];
const array2 = [1, 3, 5, 6];

function merge(arr1, arr2) {
  let arr = [];

  while (arr1.length || arr2.length) {
    if (arr1.length && arr2.length) {
      const item = arr1[0] < arr2[0] ? arr1.shift() : arr2.shift();
      arr.push(item);
    } else {
      const items = arr1.length && !arr2.length ? arr1 : arr2;
      arr.push(...items);
      break;
    }
  }

  return arr;
}

console.log(merge(array1, array2));

→ Ссылка