javascript - 使用 JavaScript/TypeScript 过滤两个数组
问题描述
我想在 UI 上制作一个复选框列表,用户可以使用它来切换和过滤一组数据结果。复选框可以是累积的,所以我现在将它们存储为字符串数组。我的代码看起来像这样。
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
数组中。
在 UI 上,我有一组基于国家/地区的复选框,这些复选框通过国家/地区数组循环填充。在选择一个复选框时,我触发了以下代码。同样,这里的目标是向要过滤的术语数组添加多个内容(所以我想按位置 + 名称进行过滤)。
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,过滤器函数会在从 API 返回的结果中查找某些内容这说明了这两个条件。
解决方案
似乎一些 HOF 和过滤器映射可以帮助您组织用户确定的逻辑/过滤。
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;
}
这里的 checkboxes 是 DOM 中的复选框映射,由与过滤器相同的键索引。
推荐阅读
- uwp - UWP Wifi Direct 获取异常代码 0x288 (ERROR_DEVICE_ENUMERATION_ERROR)
- python-3.x - 如何将 Excel 和 Python 打包在一起并分发给业务用户?
- php - 如何从 MySQL 中获取数据作为数组并根据 PHP 中的下拉选择动态填充文本字段
- polymer - 聚合物初始化(无响应)
- c - 以乘法格式显示的素数因子
- argparse - 你如何为 python 模块的 argparse 编写 unittest?
- python - Gradient Boosting 分类器 - scikit 中训练数据的准确性
- django - 如何在 Django 中使用相同的 url
- java - 使用循环接受额外的用户输入,直到用户输入一个结束输入的值
- docker - 在 Laradock 中 Ghostscript 版本没有变化