Как исправить функцию которая возвращает подстроку из переданной строки. (javascript)
Есть функция(см. ниже). Как пример, если вызвать console.log (substr('abba', 2, 3)); выдает - baundefined. В чем причина, помогите разобраться.
Функция принимает на вход три параметра:
- Строка.
- Начальный индекс. Значение по умолчанию: 0.
- Длина подстроки. Значение по умолчанию: длина всей строки.
const substr = (str, index = 0, strL) => {
let result = '';
if (strL > str.length) {
strL = str.length;
};
if (strL < 0) {
strL = 1;
};
if (index < 0) {
index = 0;
};
if (index > strL) {
return '';
};
for(let i = index; i < index+strL; i++){
result += str[i];
};
return result;
};
substr('abba', 0, 1); // => a
substr('abba', 1, 2); // => bb
substr('abba', -10, 2); // => ab
substr('abba', -1, 100); // => abba
substr('abba', -1, -1); // => a
substr('abba', 1, -10); // => b
substr('abba', 1, 10); // => bba
substr('abba', 1, 0); // => ''
substr('abba', 100, 3); // => ''
Ответы (3 шт):
Проблема здесь:
result += str[i];
Сложение result += str[i]; воспринимается JS как конкатенация строк.
Символ номер которого больше чем str.length возвращает undefined.
JS пытается сложить строчку и тип Undefined, приводит undefined к строчке 'undefined' и записывает его в конец строки result.
Вариантов исправления 2.
- Ввести переменную
max = index+strLи заранее не дать ей превзойтиstr.length
const max = index + strL
if( max > str.length ) max = str.length;
for( let i = index; i < max; i++ ) {
result += str[i];
}
- Проверять в цикле и делать
break, если сумма превысила. Первый вариант лучше, проверок меньше.
Как @vsemozhebuty писал в коментах, у вас неверные предположения в коде. Вот что-то более-менее похожее на рабочий код, с сохранением вашего подхода:
const substr = ( str, index = 0, strL )=>{
if( index < 0 || index > str.length - 1 ) throw Error('неверный индекс');
if( strL < 0 ) throw Error('неверная длина');
if( index + strL > str.length ){
strL = str.length - index;
}
let result = '';
for( let i = index; i < index + strL; i++ ){
result += str[i];
}
return result;
};
console.log( substr('abba',2,3) );
console.log( substr('abba',3,500) );
/* Проверки с ожидаемыми ошибками:
console.log( substr('abba',-1,500) );
console.log( substr('abba',500,3) );
console.log( substr('abba',2,0) );
*/
Чем вам не угодила стандартная функция substr встроенная в js?
const substr = ( str, index = 0, strL )=>{
if( index < 0 || index > str.length - 1 ) throw Error('неверный индекс');
if( strL < 0 ) throw Error('неверная длина');
if( index + strL > str.length ){
strL = str.length - index;
}
let result = '';
for( let i = index; i < index + strL; i++ ){
result += str[i];
}
return result;
};
console.log( substr('abba',2,3) );
console.log( substr('abba',3,500) );
console.log('abba'.substr(2, 3));
console.log('abba'.substr(3, 500));