You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:48:03