фильтрация двух массивов с помощью JavaScript / TypeScript

#javascript #typescript

#javascript #typescript

Вопрос:

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

 export interface IMyObjectFromAPI {
   status: {
      id: number,
      description: string,
      location: string,
      name: string,
      imageUrl: string
  }
}

var filteredByTerms: string[] = [];
var resultsFromAPI: IMyObjectFromAPI [] = [];
var filteredDataResults: IMyObjectFromAPI[] = [];
 

Я сохраняю возвращаемые результаты от вызова api в resultsFromAPI массив.

В пользовательском интерфейсе у меня есть группа флажков на основе стран, которая заполняется циклом через массив стран. При выборе флажка я запускаю следующий код. Опять же, цель здесь состоит в том, чтобы добавить несколько элементов в массив терминов для фильтрации (поэтому я хочу фильтровать по местоположению имени).

 filterDataResults(term: string) {
  var indexOfTerm = this.filteredByTerms.indexOf(term);
  // if the term is not in an array of terms to filter by, add it
  if (indexOfTerm === -1) {
   this.filteredByTerms.push(term);
   this.filteredDataResults = this.resultsFromAPI.filter(x => x.location === 
                              this.filteredByTerms.includes(term));
  }
   else {
     this.filteredByTerms.splice(indexOfTerm, 1);
     this.filteredDataResults = this.resultsFromAPI.filter(x => x.location === 
                                this.filteredByTerms.includes(term));
  }
}
 

Я не знаю, правильно ли я это объясняю, но я приложил картинку, чтобы помочь. Ряд флажков слева, набор данных справа, и флажки могут быть кумулятивными (так, в примере с изображением, если я выберу ITContractor и Clinical Psychology, функция filter будет искать что-то в результатах, возвращаемых из API, что актуализирует оба условия.

введите описание изображения здесь

Комментарии:

1. В вашем примере filteredByTerms это массив местоположений?

2. да, но я хочу сделать так, чтобы это могло быть любое свойство в массиве resultsfromAPI

Ответ №1:

Похоже, что некоторые HOF и map фильтров могут помочь вам организовать определяемую пользователем логику / фильтрацию.

 const filters = {
  lastHourFilter: (result) => result.postedDate > Date.now() - ms('1 hour'),
  last24HoursFilter: (result) => result.postedDate > Date.now() - ms('24 hours'),
  ...
  itContractorFilter: generateSpecialismFilter('IT Contractor'),
  clinicalPsychologyFilter: generateSpecialismFilter('Clinical Psychology'),
  ...
  fullTimeFilter: generateJobTypeFilter('Full Time'),
  temporaryFilter: generateJobTypeFilter('Temporary')
}
 

Затем вы проверяете флажки и определяете, какие фильтры следует применить к результатам. Что-то вроде:

 function applyFilters(results) {
  Object.keys(filters).forEach((key) => {
    if (checkboxes[key].checked) results = 
  results.filter(filters[key]);
  });
  return results;
}
 

Здесь флажки — это карта флажков в DOM, индексируемых теми же ключами, что и ваши фильтры.

Комментарии:

1. Мне это нравится, но мне интересно узнать о реализации этой строки: Здесь флажки — это карта флажков в DOM, индексируемых теми же ключами, что и ваши фильтры.

2. Что-то вроде « флажки = { lastHourFilter: document.getElementById(‘lastHourFilterCheckbox’), … «