Ожидается, что будет возвращено значение в конце функции-стрелки array-callback-return для функции фильтра - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю в React и в настоящее время получаю сообщение об ошибке «Ожидается, что в конце стрелки будет возвращена функция array-callback-return».Я искал другие вопросы, но не могу найти тот, который соответствует мин (если я не полностью слепой).У меня есть следующий код.

const self = this;
const relevantCompanyMeasures = this.props.companyMeasures
  .filter(companyMeasure => {
    for(const measure of self.state.measures) {
      if(measure.id === companyMeasure.measure_type_id) return true;
      else return false;
    }
  });

Код перебирает два массива объектов в поисках совпадения между ними.Если бы я вернул true только для совпадений, я бы понял ошибку.Тем не менее, я возвращаю false в случае отсутствия совпадения.В результате я изо всех сил пытаюсь увидеть, как бы я оказался в ситуации, когда нет возвращаемого значения в конце функции стрелки.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Это потому, что return выходит только из цикла for, а не весь обратный вызов в Array.prototype.filter().Вместо использования цикла for, чтобы проверить, существует ли companyMeasure.measure_type_id в self.state.measures, вы можете просто создать карту массива , которая возвращает все идентификаторы, а затем проверить этот массив возврата, если идентификатор существует, используя Array.prototype.includes:

const self = this;
const relevantCompanyMeasures = this.props.companyMeasures
  .filter(companyMeasure => {
    return self.state.measures.map(m => m.id).includes(companyMeasure.measure_type_id);
  });

Еще лучше:

  • , так как вы используете функции со стрелками, лексический this из области видимости сохраняется, поэтомувам даже не нужен прокси this на всех
  • , вы также можете создать карту массива вне обратного вызова .filter(), чтобы уменьшить накладные расходы
  • , теперь обратный вызов .filter() равен единице-линер, мы можем избавиться от фигурных скобок и воспользоваться неявными возвратами в функциях стрелок

Вот как должен выглядеть окончательный код:

const ids = this.state.measures.map(m => m.id);
const relevantCompanyMeasures = this.props.companyMeasures
  .filter(companyMeasure => id.includes(companyMeasure.measure_type_id));
0 голосов
/ 26 февраля 2019

const self = this;
const relevantCompanyMeasures = this.props.companyMeasures
  .filter(companyMeasure => {
             return self.state.measures.map(meas => meas.id).indexOf(companyMeasure.measure_type_id)!=-1
    }
   );

Попробуйте это

0 голосов
/ 26 февраля 2019

Либо:

  1. Цикл начинается
  2. Вы получаете первое measure
  3. Условие истинно, и вы возвращаете истину
  4. Вы никогда не переходите ко второму measure

Или:

  1. Цикл начинается
  2. Вы получаете первый measure
  3. Условие ложно, и вы возвращаете ложь
  4. Вы никогда не переходите ко второму measure

Избавьтесь от else и переместите return false в после цикла, поэтому он запускается только в том случае, если вы дошли до конца цикла, не найдя соответствия.

...