Почему этот объектный метод JavaScript возвращает метод «не функция»?

#javascript #node.js

#javascript #node.js

Вопрос:

 this.breakintoletters=()=>
        this.lengthi!==0?(this.title2=this.title,this.title2.split(),this.title2.
            map((x)=>this.arol.push(new letter(x))))
                        :!!false 
  

Итак, в основном это код. Предполагается, что он разбивает строку на буквы, а затем помещает соответствующие объекты в массив..
Выполняется проверка длины строки, если не 0, возвращает ошибку, в которой находится функция MAP …) TypeError сообщает мне, что это не функция. Редактор не показывает ошибки. Был бы признателен за помощь

Комментарии:

1. Какое злоупотребление троичным оператором. И map .

2. Ваш код крайне нечитабелен, и map и push в целом не является хорошим способом использования map

3. «как будто это НЕ НЕ FALSE, следовательно, true» — это не то, как работает это логическое обозначение. Он вернется false . С какого исходного значения начинать. Поэтому использовать этот трюк здесь бессмысленно.

4. Ваша проблема в том, что this.title2.split() вы не присваиваете разделенное значение this.title2 , а не используете map для this.title2 , который является string

5. разделение ничего не разделяет без значения.

Ответ №1:

Я предлагаю использовать другой подход, проверяя this.lengthi заранее и возвращая либо false , либо позже отображенную длину переданных значений.

 this.breakintoletters = () => {
    if (!this.lengthi) return false;
    this.title2 = this.title;
    // this.title2.split(); the result is not taken, not even splitted
    return this.title2.map(x => this.arol.push(new letter(x)));
};  

Ответ №2:

Вы не присваиваете разделенное значение обратно this.title2 и не используете map для this.split2 , которое является строкой

 this.breakintoletters=()=>
        this.lengthi  ? (this.title2=this.title,
                         this.title2=this.title2.split(), 
                         this.title2.map((x)=>this.arol.push(new letter(x))))
                      :false
  

ИМО, вы должны попытаться сделать свой код понятным только до такой степени, чтобы он оставался доступным для чтения, вы можете просто сделать это следующим образом

 this.breakintoletters = ( ) => {
     if(this.lengthi === 0 ) return false;
     this.title2=this.title;
     this.title2=this.title2.split(); 
     return this.title2.map((x) => this.arol.push(new letter(x)))) 
 }
  

Ответ №3:

(this.title2=this.title, this.title2.split(), this.title2. map((x)=>this.arol.push(новая буква(x))))

this.arol Это имя массива?

Попробуйте реструктурировать его, чтобы быть:

(this.title.split().map((x) => this.arol.push(новая буква(x)))

Такие методы, как split() join() map () и т.д., Могут быть объединены в цепочку.

Я бы переосмыслил использование функции map здесь, хотя и троичный, который другие комментаторы рассмотрели выше. Я имею в виду, что технически это работает, но если цель состоит в том, чтобы выполнить итерацию по строке, чтобы получить определенные значения, было бы лучше использовать цикл for. Функции отображения больше, когда вы хотите выполнить итерацию, чтобы применить один и тот же указанный метод к каждому отдельному символу

Кроме того, это всего лишь форматирование, но оно значительно облегчает чтение и понимание вашего кода, когда у вас есть некоторые пробелы между переменными и операторами, и вы выбираете имена переменных, которые имеют смысл для того, что вы делаете (this.bookLength , this.reverseAr), или, по крайней мере, используя общий this.array или this.arr. Это облегчает задавать подобные вопросы, потому что вы получите меньше уточняющих вопросов об опечатках, а также, если вы когда-либо планируете работать над большей базой кода, это важно писать чистый код, понятный тем, кто вас не знает

Комментарии:

1. Большое вам спасибо за такой подробный ответ. это. lengthi объявлен в другом месте, это не «длина», я делал!! false поскольку один из моих наставников пишет подобный код (разработчик программного обеспечения), я просто скопировал это у него и с тех пор использую. Используя !! false Я просто пытался показать, что это даст false. это. arol — это массив в объекте, да. Один из моих наставников предложил использовать map / filter / reduce чаще, чем для циклов, потому что, по-видимому, это легче понять другим разработчикам. Я думаю, на основе Opnion.

2. Map filter и reduce — отличные методы, но я немного подробнее объяснил выше, почему это может быть не лучшим выбором в данном случае (особенно при итерации с целью перехода к массиву, это не имеет особого смысла), но если это работает, это работает. Это интересно в !! false Я никогда раньше не видел такого в JavaScript, ваш наставник работает в JavaScript?

3. @MxOliver: !!false конечно, не имеет никакого практического смысла, но этот трюк широко используется, когда вы хотите убедиться, что вы получаете логическое значение, а не другое ложное значение: answer = ""; !!answer (или что-то в этом роде).