2017-02-24 2 views
1

React.jsコンポーネントであるfixed-data-tableを使用して、データをテーブルに取り込みます。しかし、この段階でそれほど重要ではありません。try/catch(err)を使用せずに 'null'を返すindexOfはどのように扱うのですか?

テーブルには、問題の原因となる検索ボックスがあります。

まず、コードの興味深い部分を示します。

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/catchで

 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') 
     } 

は、それが意図したとおりに、100%の作品とのindexOfはnullを返すハンドル..私は最後の部分を変更した場合、私は、コードを動作させることができ、..ですしかし、これは適切に処理する方法ではありません - 私は、この種の例外処理はまれな例外であると想定されています。実際にはフロントエンドでバックエンド。

上記のJavascriptコードでnullを返すindexOfはどのように処理しますか?取り込まれているいずれかのソース列にはnullが返されることがあります。

+0

のindexOfは 'eighter返す必要があります-1'または任意のインデックス、nullにはなりません。エラーをスローすると、nullを返すためではありません。サンプルデータを使ってスニペットでこの作業を行うことはできますか? – Randy

+0

'indexOf'は配列上で実行されたときに' null'を返すことはありません。前の変数の一つ( 'backendInfo'かそのプロパティの一つ)が犯人でなければなりません。あなたが得る正確なエラーテキストは何ですか? – gyre

+0

申し訳ありません。私は自分自身を貧弱に言いました。入力データに値がnullのキーが含まれている可能性があります。それが私の言いたいことです。 "Uncaught 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

文全体で1つを実装しようとしましたが、エラーはスローされませんが、検索機能はオフです。私はあなたのように変数を作成しようとします。 – cbll

+0

@cbll変更する必要があるのは、 'instanceof'が正しく設定されているかどうかを確認することだけです。結果を変えるべきではなく、エラーを防ぐだけです。私は 'firstnameHasKey && lastnameHasKey'を偶然持っていました。それは明らかに' firstnameHasKey || lasthameHasKey'です。 – Randy

+0

しかし、indexOfが-1を返さないかどうかを確認する必要がありますか? – cbll

関連する問題