2017-02-24 82 views
1

我正在用数据填充表 - 使用fixed-data-table,这是一个React.js组件。但是,在现阶段这并不重要。如何在不使用try/catch(err)的情况下处理indexOf返回'null'?

表中有问题源于的搜索框。

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

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 .. 。但这不能成为正确处理它的方式 - 我假设这种异常处理应该是罕见的例外,并且不应该在前端使用真正的异常处理后端。

如何在上面的Javascript代码中处理indexOf返回null?它可能会在任何正在填充的源列中返回null。

+0

的indexOf应该返回eighter'-1'或任何索引,永远不为null。如果它抛出一个错误,那不是因为它返回null。您可以使用样本数据在片段中完成此项工作吗? – Randy

+0

'indexOf'在数组上运行时永远不会返回'null';你的一个前面的变量('backendInfo'或它的一个属性)必须是罪魁祸首。什么是你得到确切的错误文字? – gyre

+0

对不起。我的自言自语很差。输入数据可能有一个键值为null的键。我正是这个意思。我得到的错误是'未捕获的TypeError:无法读取属性'indexOf'的空' – cbll

回答

1

如果找不到密钥,JS会引发错误。 Try-catch是修复这些错误的好方法,但还有一种替代方法:

您可以在将值推入对象之前检查对象是否存在于对象中。

var data = { }; 
 

 
var key = "test"; 
 

 
// your method works great 
 
try { 
 
    var value = data.firstname.indexOf(key); 
 
} catch (err) {} 
 

 
// another method, I'd prefer the try/catch 
 
var value = data.firstname ? data.firstname.indexOf(key) : undefined; 
 

 

 
// test if the object is the type of object you are looking for 
 
// this is in my opinion the best option. 
 
if(data.firstname instanceof Array){ 
 
    var value = data.firstname.indexOf(key); 
 
} 
 

 

 
// you can use the last option in your code like this: 
 

 
var firstnameHasKey = data.firstname instanceof Array && ~data.firstname.indexOf(key); 
 
var lastnameHasKey = data.lastname instanceof Array && ~data.lastname.indexOf(key); 
 
if(firstnameHasKey || lastnameHasKey){ 
 
    // logics 
 
}

如果测试instanceof & & indexOf,绝不是一个错误。如果firstnameundefined,则indexOf将不会被检查。

Ofcourse你可以使用这个对于其他类型:

var myDate = new Date(); 
myDate instanceof Date;  // returns true 
myDate instanceof Object; // returns true 
myDate instanceof String; // returns false 

MDN documentation

+0

我试图在一个句子中实现整个事情;它不会抛出错误,但搜索功能是关闭的。我会尝试创建像你所建议的变量。 – cbll

+0

@cbll你唯一需要改变的是检查'instanceof'是否设置正确。这不应该改变结果,只是防止错误。偶然有'firstnameHasKey && lastnameHasKey',那显然应该是'firstnameHasKey‖。 lasthameHasKey'。 – Randy

+0

但是我们仍然应该检查indexOf是否不返回-1? – cbll

相关问题