在Typescript/Angular中如何依据数组属性值提取对象子集?
TypeScript 基于指定属性值数组提取对象子集的最优实现
我们可以根据数据量和输出顺序要求选择对应方案:
1. 小数据量场景(数组长度均<1000、单次查询)
直接用Array.filter+Array.includes实现,写法最简洁直观:
// 定义TS类型(可选,可根据实际业务调整) interface CityItem { id: string; name: string; } const Aobject: { cities: CityItem[] } = { "cities": [ { "id": "city_id1", "name": "NY" }, { "id": "city_id2", "name": "BOS" }, { "id": "city_id3", "name": "SF" }, { "id": "city_id4", "name": "LA" } ] } const Aarray: string[] = ["city_id2", "city_id3"]; // 核心实现 const result = Aobject.cities.filter(city => Aarray.includes(city.id));
- 时间复杂度:
O(m*n),m为原对象数组长度,n为指定id数组长度 - 特点:无额外空间开销,代码易读性高,适合绝大多数轻量场景
2. 大数据量/特殊要求场景
2.1 无需保留输入数组顺序,追求查询效率
先将指定id数组转成Set,利用Set的O(1)查询复杂度优化性能:
const idSet = new Set(Aarray); const optimizedResult = Aobject.cities.filter(city => idSet.has(city.id));
- 时间复杂度:
O(m + n),相比小数据量方案性能提升明显 - 特点:额外占用
O(n)空间存储Set,适合数组长度过万、或者需要多次复用id匹配规则的场景
2.2 要求输出顺序和输入id数组顺序完全一致
先将原对象数组转成id为key的Map,再遍历id数组匹配对应对象:
const cityMap = new Map(Aobject.cities.map(city => [city.id, city])); // filter(Boolean) 是为了过滤掉id不存在的空值,可根据业务需求决定是否保留 const orderedResult = Aarray.map(id => cityMap.get(id)).filter(Boolean) as CityItem[];
- 时间复杂度:
O(m + n) - 特点:输出顺序完全和输入的id数组一致,适合对结果顺序有要求的场景
内容的提问来源于stack exchange,提问作者achai
相关产品推荐
相关产品推荐

