2017-07-16 12 views
1

Array.prototype.filterを使用して、オブジェクト名配列からファーストネームを検索しています。私は名字を検索するために検索を変更し、そこにない場合は名字を検索したいと考えています。タイプArrayオブジェクト内の複数のプロパティを検索するスクリプト

student_name : any = [{name:"Udhay" , lname:"Ravi"}, 
       {name:"Sabari" , lname:"Raj"}, 
       {name:"Sachin" , lname:"Karthi"}, 
       {name:"Sudha" , lname:"Mohan"}] 

search(){ 
var this.myInput = "Ravi" 
this.student_name = this.student_name.filter((sn) => {    
return(sn.name.toLowerCase().indexOf(this.myInput.toLowerCase())> -1) 
}) 

} 

誰か助けてもらえますか?

search() { 
    this.myInput = "Ravi"; 

    // Convert it to lower case here to avoid lower case conversion twice inside filter. 
    let searchFilter = this.myInput.toLowerCase(); 

    this.student_name = 
     this.student_name.filter(sn => 
      sn.name.toLowerCase() === searchFilter || 
      sn.lname.toLowerCase() === searchFilter); 
} 

filter機能します:私は、これは、それは次のようになります簡単にlodash

search(){ 
this.myInput = "Ravi" 
this.result= _.filter(this.student_name, {'name':this.myInput}); 
if(_.isEmpty(this.result)){ 
    this.result=_.filter(this.student_name, {'lname':this.myInput}) 
} 
} 

LIVE DEMO

答えて

0

非常に活字体への新しい角度午前各要素の比較を実行します。そのため、を使用する必要はありません。これは、最初の配列の各要素に対してループを実行し、後でfilter関数の結果として返される新しい配列内で条件を満たす要素をプッシュするようなものです。

EDIT:

チェックすると、任意の名前や姓starts with検索文字列:

sn.name.toLowerCase().startsWith(searchFilter) || 
sn.lname.toLowerCase().startsWith(searchFilter) 

チェックすると、任意の名前や姓contains検索文字列:

sn.name.toLowerCase().includes(searchFilter) || 
sn.lname.toLowerCase().includes(searchFilter) 
0

を使用して達成することができる2

+0

感謝あなたはmsmolcic。私が解決策を見ている問題は、正確なマッチであり、適切なマッチではないということです。私は検索バーにロジックを実装したい。 – Udhay

+0

@Udhayあなたの例では、正確な一致を検索していたので、私はこの例を挙げました。入力文字列に名前または姓が '〜で始まるか '含まれているかどうかをチェックする場合は、フィルタ条件を変更するのは簡単です。答えの 'edit'部分をチェックし、必要に応じてフィルターの内部の条件を変更してください。 – msmolcic

関連する問題