Проверка на null
Функция должна возвращать true, если в строке одинаковое кол-во символов 'o' и 'x', но если передать функции строку 'xxxm', вызывается ошибка 'Cannot read property 'length' of null', вроде и проверка есть(в закомментированом варианте), но даже так вызывается ошибка, возможно проверка неправильная?
function XO(str) {
console.log(str);
// if( str.length === 0 || ( str !== null && (str.match(/o/gi).length !== null && str.match(/x/gi).length !== null) ) && (str.match(/o/gi).length === str.match(/x/gi).length) ){
// return true;
// }else{
// return false;
// }
return ( str.length == 0 || (str.match(/o/gi).length === str.match(/x/gi).length) ) ? true : false;
}
Ответы (2 шт):
Автор решения: Александр Лесив
→ Ссылка
Все правильно: если совпадений с регулярным выражением нет, то возвращается null, а не пустой массив
function XO(str) {
const matchO = str.match(/o/gi);
const matchX = str.match(/x/gi);
return (
matchO !== null &&
matchX !== null &&
matchO.length === matchX.length
);
// Такой же результат
// return (
// matchO &&
// matchX &&
// matchO.length === matchX.length
//);
}
console.log(XO('xxxm'));
console.log(XO('xoo'));
console.log(XO('xxoo'));
Автор решения: OPTIMUS PRIME
→ Ссылка
match() возвращает либо НЕпустой массив совпадений, либо null;
Можно использовать логическое ИЛИ ||: null в логическом контексте будет false, поэтому возьмется пустой массив справа.
console.log( x_o_areEqual( "xoxoxo" ) );
console.log( x_o_areEqual( "xxxm" ) );
console.log( x_o_areEqual( "xxxoo" ) );
function x_o_areEqual(str) {
let o = str.match(/o/gi) || [];
let x = str.match(/x/gi) || [];
return o.length === x.length;
}
Можно использовать и в виде let o_len = ( str.match(/o/gi) || [] ).length;