Javascript:Uncaught TypeError:无法读取属性' indexOf'为null

时间:2017-02-24 10:20:14

标签: javascript arrays reactjs fixed-data-table

我用数据填充表 - 使用fixed-data-table,这是一个React.js组件。但是,在这个阶段,这并不是那么重要。

该表有一个搜索框,问题源自。

首先,这是代码中有趣的部分。

for (var index = 0; index < size; index++) {
            if (!filterBy || filterBy == undefined) {
                filteredIndexes.push(index);
            }
            else {

                var backendInfo = this._dataList[index];

                var userListMap = hostInfo.userList;

                var userListArr = Object.values(userListMap);


                function checkUsers(){
                    for (var key in userListArr) {
                        if (userListArr.hasOwnProperty(key) && userListArr[key].text.toLowerCase().indexOf(filterBy) !== -1) {
                            return true;
                        }
                    }
                    return false;
                }


                if (backendInfo.firstName.indexOf(filterBy) !== -1 || backendInfo.lastName.toLowerCase().indexOf(filterBy) !== -1 || backendInfo.countryOrigin.toLowerCase().indexOf(filterBy) !== -1
                    || backendInfo.userListMap.indexOf(filterBy) !== -1) {
                    filteredIndexes.push(index);
                }

            }
        }

如果在表格中输入内容,并且列在给定单元格中返回null,则会呈现此内容并且最后一部分会抛出错误。

问题是,如果我将最后一部分更改为..

,我可以使代码工作
        try {
            if (backendInfo.firstName.indexOf(filterBy) !== -1 || backendInfo.lastName.toLowerCase().indexOf(filterBy) !== -1 ||    backendInfo.countryOrigin.toLowerCase().indexOf(filterBy) !== -1
            || backendInfo.userListMap.indexOf(filterBy) !== -1) {
            filteredIndexes.push(index);
            }
        }
        catch(err) {
            console.log('Exception')
        }

使用try / catch,它按预期工作100%并处理indexOf返回null ...但这不能正确处理它 - 我假设这种异常处理嗯,应该是罕见的例外,并且不应该像前端一样真正地用在前端。

如何在不使用try / catch的情况下处理标题中的错误?

1 个答案:

答案 0 :(得分:1)

您正在使用indexOf,因此请确保这些值不是undefined or null,您可以通过检查每个值来解决此问题:

let {firstName, lastName, countryOrigin, userListMap} = backendInfo;

if ((firstName && firstName.indexOf(filterBy) !== -1) 
      || (lastName && lastName.toLowerCase().indexOf(filterBy) !== -1) 
      || (countryOrigin && countryOrigin.toLowerCase().indexOf(filterBy) !== -1)
      || (userListMap && userListMap.indexOf(filterBy) !== -1)) {
            filteredIndexes.push(index);
}

或解决此问题的其他方法是,您为这些变量firstName, lastName, countryOrigin, userListMap定义的默认值,如果它们是数组,那么它应该是[],如果是字符串那么它应该是'' }。