Фильтрация массива объектов с помощью lodash на Angular - PullRequest
5 голосов
/ 15 мая 2019

Я работаю над Angular 7, и я хотел бы применить несколько фильтров к списку объектов, которые я получаю от моего бэкенда. Объекты относятся к типу, который я называю "CV". Внутри резюме находятся другие объекты, такие как описанные ниже.

CV {
  employee: Employee;
  certifications: Certification[];
}
Employee {
  empId: number;
  empAgency: string;
  empBu: string;
}

Моя основная проблема заключается в том, что мне нужно отфильтровать список CV по свойствам вложенных объектов.

Этот урок очень вдохновил меня на применение нескольких фильтров: https://angularfirebase.com/lessons/multi-property-data-filtering-with-firebase-and-angular-4/.

Я пробовал что-то подобное в машинописи.

  employees: CV[];
  filteredEmployees: CV[];
  //array I use to filter
  filters = {};
  
  //properties I wanna filter by
  empAgency: string;
  empBu: string;
  //standard entry to delete a filter property value
  private DefaultChoice: string = "DefaultChoice";
  
   private applyFilters() {
    if (this.filteredEmployees.length === this.employees.length) {
      this.filteredEmployees = _.filter(this.filteredEmployees,     _.conforms(this.filters));
    } else {
      this.filteredEmployees = this.employees;
      this.filteredEmployees = _.filter(this.filteredEmployees, _.conforms(this.filters));
    }
  }
filterExact(property: string, property2: string, rule: any) {
    if (rule ==='DefaultChoice') {
      delete this.filters[property][property2];
      this.filters[property] = [];
      this.filters[property][property2] = null;
    }
    else {
      this.filters[property] = [];
      this.filters[property][property2] = val => val === rule;
    }
    this.applyFilters();
  }

Но он не работает с вложенными свойствами. Моя проблема в том, что я не понимаю, как правильно передать своей функции свойство вложенного объекта.

Кто-нибудь может помочь?

Помогая, я также включаю любые другие предложения о том, как связать несколько фильтров на вложенных объектах в Angular (с / без lodash). Я все еще новичок в этой области, поэтому не стесняйтесь указывать мне правильное направление!

1 Ответ

0 голосов
/ 15 мая 2019

Следуя приведенному вами примеру, я не думаю, что вам нужно передавать оба свойства в filterExact().Я думаю, вам просто нужно написать дополнительные функции фильтра для выполнения фильтрации 2-го уровня, которую вы пытаетесь выполнить:

  filterExactAgency(property: string, rule: any) {
    this.filters[property] = val => val == rule
    this.applyFilters()
  }

  filterExactBusinessUnit(property: string, rule: any) {
    this.filters[property] = val => val == rule
    this.applyFilters()
  }

...