ОШИБКА TypeError: не удается прочитать свойство ‘toLowerCase’ неопределенного для канала

#javascript #angular #pipe

#javascript #угловой #канал

Вопрос:

У меня есть этот канал и эта ошибка в названии.

Возможно, если какие-либо значения из массива undefined в порядке, но как избежать этой ошибки?

 export class MusclePipe implements PipeTransform {
  transform(muscle, searchTerm: string): MuscleComponent {
    if (!muscle || !searchTerm) {
      return muscle;
    }

    return muscle.filter(
      (muscle) =>
        muscle.name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1
    );
  }
}
 

Ответ №1:

Обычно это означает name , что свойство не существует для одного или нескольких muscle объектов, которые вы перебираете.

В идеале вы хотите убедиться, что данные существуют. Но в вашем случае, если есть вероятность, что это не так, самый простой (и минимально правильный) способ — использовать необязательную цепочку (?.) после ключа, который потенциально может быть необязательным:

   transform(muscle: [], searchTerm: string): MuscleComponent { 
....

    return muscle.filter(muscle => 
       muscle.name?.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1); 
    }
  }
 

(обратите внимание на ? после muscle.name ).

Но поскольку вы цепляете вызовы методов, вы могли бы сделать что-то вроде этого:

     return muscle.filter(muscle => {
       muscle.name amp;amp; searchTerm
         ? muscle.name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1)
         : 'alternative return value';
       }
    }

 

Здесь мы используем тернарный оператор (if..else) для явной проверки значения и возврата альтернативного значения. Я также добавил проверку на searchTerm то, что оно потенциально может быть неопределенным:

muscle.name amp;amp; searchTerm

Ответ №2:

Вы также должны включить проверку на случай, если у muscle неверно name определено свойство, поскольку, похоже, это ваша ошибка.

 export class MusclePipe implements PipeTransform {
  transform(muscle, searchTerm: string): MuscleComponent {
    if (!muscle || !muscle.name || !searchTerm) {
      return muscle;
    }

    return muscle.filter(
      (muscle) =>
        muscle.name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1
    );
  }
}
 

Ответ №3:

Добавьте проверку null / undefined в свой канал, чтобы проверить, является ли строка null перед вызовом .toLowerCase

 if (str === undefined) return [];