【问题标题】:How can I avoid Array-callback-return error in my code如何在我的代码中避免 Array-callback-return 错误
【发布时间】:2021-04-18 19:10:48
【问题描述】:

我想过滤一个项目列表并根据我过滤的术语显示项目。

我的物品清单

const [persons, setPersons] = useState([
        { name: 'Arton Senna', tel: '9900000000' },
        { name: 'Ada Lovelace', tel: '39-44-5323523' },
        { name: 'Dan Abramov', tel: '12-43-234345' },
        { name: 'Mary Poppendieck', tel: '39-23-6423122' }
    ])

我有一个作为搜索字段的输入元素

    <div>
        <label htmlFor='filter'>Filter phonebook with</label>
        <input type='text' name='filter_contacts' id='filter' onChange={filterText} />
    </div>

搜索字段有一个 onchange 处理程序

const filterText = (event) => {
        return setFilter(event.target.value)
    }

我正在使用 .map 辅助方法呈现列表项

    <ul>
       {persons.map(person => <li key={person.tel}>{person.name} {person.tel}</li>)}
    </ul>

我的状态对象如下

// persons
const [persons, setPersons] = useState([
        { name: 'Arton Senna', tel: '9900000000' },
        { name: 'Ada Lovelace', tel: '39-44-5323523' },
        { name: 'Dan Abramov', tel: '12-43-234345' },
        { name: 'Mary Poppendieck', tel: '39-23-6423122' }
    ])
// serachField
    const [filter, setFilter] = useState('')

我希望能够根据我在 &lt;input/&gt; 元素中输入的内容来呈现我的列表以进行搜索,所以我做了以下操作

     <ul>
       {persons
           .filter(person => {
               if (filter === '') {
                  return person
               } else if (person.name.toLocaleLowerCase().includes(filter.toLowerCase())) {
                  return person
               }})
            .map(person => <li key={person.tel}>{person.name} {person.tel}</li>)}
     </ul>

执行此操作后,eslint 给我以下警告消息
Array.prototype.filter() expects a value to be returned at the end of arrow function.eslintarray-callback-return


**请帮助我理解这个问题,我该如何......**
  • 在此处使用另一种方法,通过过滤和呈现我的列表来做我想做的事情
  • 我这样做的方式有什么问题?(代码仍然可以正常工作,但是那个警告消息让我很烦)
  • 什么是简洁的方法来完成相同的任务

@Quentin我做了以下重构

                    {
                        filter
                            // truthy 
                            ? persons.filter(person => person.name.toLowerCase().includes(filter.toLowerCase())).map(person => <li key={person.tel}>{person.name} {person.tel}</li>)
                            // falsy 
                            : persons.map(person => <li key={person.tel}>{person.name} {person.tel}</li>)
                    }

【问题讨论】:

  • filter 回调应该返回一个布尔值,而不是一个人或未定义的值。
  • 关于重构,不要重复map 调用。写(filter ? persons.filter(…) : persons).map(…)
  • @Bergi 没想到,太棒了,谢谢回复

标签: javascript reactjs callback eslint higher-order-functions


【解决方案1】:

我的做法有什么问题?

ESLint 希望你明确地返回一些东西:总是。

如果代码到达函数的末尾,它隐式返回undefined。 ESlint 希望你是明确的。

person => {
  if (filter === '') {
    return person
  } else if (person.name.toLocaleLowerCase().includes(filter.toLowerCase())) {
    return person
  }
  return false; // Explicit
}

完成相同任务的简洁方法是什么

person => (filter === '' || person.name.toLocaleLowerCase().includes(filter.toLowerCase()).toLowerCase()) 

……应该可以解决问题。

【讨论】:

  • return person 仍然是错误的。一个合适的类型检查器也会在那里抱怨。
  • 我正在向我的代码添加一个编辑,我使用了一个三元运算符并且它有效,这是一个后续问题,所以只要我使用显式返回,使用 if/else 版本就可以了吗?我正在编辑我的帖子,请看看我的重构,谢谢你的解决方案
猜你喜欢
  • 2017-08-18
  • 2022-01-24
  • 2019-11-29
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
相关资源
最近更新 更多