Попробуйте метод some
, который сообщает, соответствует ли какой-либо из элементов массива предикату:
Если вам нужны целые массивы любого cause
, который содержит симптом с переданным в searchString, вы можете сделать:
filterCauses(searchString: string) {
searchString = searchString.toUpperCase();
return this.illnesses.filter((i) => i.symptoms.some((s) => s.toUpperCase()
.includes(searchString)));
}
ОБНОВЛЕНИЕ 1:
Если вы просто хотите возможные причины:
filterCauses(searchString: string): string[] {
searchString = searchString.toUpperCase();
return this.illnesses.filter((i) => i.symptoms.some((s) => s.toUpperCase()
.includes(searchString))).map((i) => i.cause);
}
ОБНОВЛЕНИЕ 2: (спрашивается в комментариях)
Если вы просто хотите возможные симптомы:
filterCauses(searchString: string): string[] {
searchString = searchString.toUpperCase();
const symptomSet: Set<string> = new Set<string>();
this.illnesses.forEach((i) => {
i.symptoms.forEach((s) => {
if(s.toUpperCase().includes(searchString)) {
symptomSet.add(s);
}
}
}
return Array.from(symptomSet.values());
}
ОБНОВЛЕНИЕ 3: (спрашивается в комментариях)
// @return comma separated list of matching symptoms
filterCauses(searchString: string): string {
searchString = searchString.toUpperCase();
const symptomSet: Set<string> = new Set<string>();
this.illnesses.forEach((i) => {
i.symptoms.forEach((s) => {
if(s.toUpperCase().includes(searchString)) {
symptomSet.add(s);
}
}
}
return Array.from(symptomSet.values())
.reduce((acc:string,a:string) => acc += (acc ? ', ' : '') + a,'');
}