Я пытаюсь отфильтровать массив в другой - PullRequest
1 голос
/ 24 апреля 2019

Я пытаюсь отфильтровать массив внутри другого, который является симптомом в этом сценарии.

Мои данные и код следующие:

illnesses = [

      {"cause": "abc", "symptoms": ["A", "B", "C"]},   
      {"cause": "def", "symptoms": ["g", "s", "k", "j"]}  
]


filterCauses(searchString: string){
    return this.illnesses.filter(
      (c) => {
        for (let i = 0; i < this.cause.length; i++) {
          c.symptoms.filter( d => d.symptoms[i].toLowerCase().indexOf(searchString.toLowerCase()) !== -1)
        }
      }
    )
}

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Попробуйте метод 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,'');
}
0 голосов
/ 24 апреля 2019
filterCauses(searchString: string){
  return this.illnesses.filter(illness => illness.symptoms.includes(searchString))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...