2017-08-11 12 views
3

2つのフィルタメソッドを使用して文字列に基づいてオブジェクト内の配列をフィルタリングしようとしています。ここに私のオブジェクトがどのように見えるかがあります。私はvalue.descにフィルタリングしてここcatオートコンプリートを使用するオブジェクト内のフィルタ配列

を返すようにしようとしています

[ 
    { 
    "cat": "Accommodation and Food Service Activities", 
    "value": [ 
     { 
     "sic": "55", 
     "desc": "Accommodation" 
     }, 
     { 
     "sic": "56", 
     "desc": "Food and beverage service activities" 
     } 
    ] 
    }, 
    { 
    "cat": "Activities Of Extraterritorial Organisations and Bodies", 
    "value": [ 
     { 
     "sic": "99", 
     "desc": "Activities of extraterritorial organisations and bodies" 
     } 
    ] 
    } 
] 

は、私がこれまで

filteredIndustries(industry: string) { 
    if (industry) { 
     return this.industries.filter(sector => { 
     if (sector.value) { 
      sector.value.findIndex(v => { 
      return v.desc.toString().toLowerCase().indexOf(industry.toString().toLowerCase()) === 0; 
      }); 
     } 
     }); 
    } else { 
     return this.industries; 
    } 

とここに私のhtmlでてきたもので、

<md-input-container> 
     <input mdInput placeholder="Industry" [mdAutocomplete]="auto" [formControl]="industryCtrl"> 
    </md-input-container> 

    <md-autocomplete #auto="mdAutocomplete" [displayWith]="displayIndustry.bind(this)"> 
     <md-option *ngFor="let industry of filteredIndustry | async" [value]="industry"> 
     {{ industry.cat }} 
     </md-option> 
    </md-autocomplete> 

だから私は食べ物を入力するとき、それはvalue.descにフィルターをかけて、を返すべきですこれはAccommodation and Food Service Activities

ですが、戻り値が真であっても戻り値は得られません。

ご協力いただければ幸いです。

+0

SOへようこそ!これは良い最初の質問です。あなたのコードを投稿し、問題を適切に説明して、簡単にあなたを助けてください。 +1 –

答えて

1

findIndexが-1より大きい何かを返した場合、filterコールバック関数はreturn文を逃します。trueを返す必要があります。

filteredIndustries(industry: string) { 
    if (industry) { 
     return this.industries.filter(sector => { 
     if (sector.value) { 
      return -1 < sector.value.findIndex(v => { //HERE 
      return v.desc.toString().toLowerCase().indexOf(industry.toString().toLowerCase()) === 0; 
      }); 
     } 
     }); 
    } else { 
     return this.industries; 
    } 
} 
+1

filter()に渡された関数は常に未定義を返し、それは "偽の"値なので、配列this.industriesのすべての要素を除外します。 –

+0

助けてくれてありがとうそれは働いている。 – Ergun

0

あなたはsome()の代わりfindIndex()を使用することができます。 indexOfは、指定された文字列が見つからない場合は-1を返します。

var industries = [ 
 
    { 
 
    "cat": "Accommodation and Food Service Activities", 
 
    "value": [ 
 
     { 
 
     "sic": "55", 
 
     "desc": "Accommodation" 
 
     }, 
 
     { 
 
     "sic": "56", 
 
     "desc": "Food and beverage service activities" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "cat": "Activities Of Extraterritorial Organisations and Bodies", 
 
    "value": [ 
 
     { 
 
     "sic": "99", 
 
     "desc": "Activities of extraterritorial organisations and bodies" 
 
     } 
 
    ] 
 
    } 
 
] 
 

 
var industry = 'food' 
 
var b = industries.filter(sector => { 
 
    if (sector.value) { 
 
    return sector.value.some(v => v.desc.toLowerCase().indexOf(industry) >= 0); 
 
    } else { 
 
    return industries 
 
    } 
 
}); 
 

 
console.log(b)

+0

残念ながら、これは値を返しませんでした。とにかくありがとう。それをソートしました – Ergun

+1

私のコードが機能することを示すために私の答えを編集しました。 – kulaeff

関連する問題