2017-08-11 3 views
3

Ich versuche, ein Array innerhalb eines Objekts basierend auf einer Zeichenfolge mit zwei Filtermethoden zu filtern. So sieht mein Objekt aus.Filter-Array innerhalb des Objekts mit Autocomplete

[ 
    { 
    "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" 
     } 
    ] 
    } 
] 

ich auf dem value.desc zu filtern versuche und geben die cat

Hier ist, was ich bisher

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; 
    } 

und hier ist mein 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> 

Also wenn ich Essen betrete, sollte es auf value.desc filtern undzurückgebendie Accommodation and Food Service Activities sein sollte

Aber ich bekomme keinen Rückgabewert, obwohl mein Rückgabeergebnis wahr ist.

Jede Hilfe würde sehr geschätzt werden.

+0

Willkommen bei SO! Das ist eine gute erste Frage, du hast deinen Code gepostet und dein Problem richtig erklärt, um dir zu helfen. +1 –

Antwort

1

Ihre filter Callback-Funktion vermisst eine return-Anweisung, wenn findIndex etwas größer als -1 zurückgibt, sollten Sie 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

Es ist nur, dass die Funktion, die Sie an filter() zurückgegeben immer undefined und es ist ein "Falsy" -Wert, so dass es alle Elemente des Arrays filtert this.industries –

+0

Danke für Ihre Hilfe, hat mir geholfen, zu bekommen es funktioniert. – Ergun

0

können Sie some() anstelle von findIndex(). indexOf gibt -1 zurück, wenn die angegebene Zeichenfolge nicht gefunden wurde.

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

Leider hat dies keinen Wert zurückgegeben. Danke trotzdem. es aussortiert – Ergun

+1

Ich habe meine Antwort bearbeitet, um zu zeigen, dass mein Code funktioniert. – kulaeff

Verwandte Themen