В чем причина ошибки "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 шт):
Ошибка заключается в том, что когда доходим до состояния
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));