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

TypeScript数组过滤:从PhoneTypesAll排除已选电话类型

问题:过滤未选中的电话类型数组

现有数据

PhoneTypesAll(所有电话类型)

[{"Id":"3","DisplayName":"Fax"},{"Id":"1","DisplayName":"Home"},{"Id":"4","DisplayName":"Mobile"},{"Id":"2","DisplayName":"Office"},{"Id":"5","DisplayName":"Other"}]

PhoneTypesSelected(已选中的关联电话记录)

[{"PhoneNumberId":127436,"ContactId":22222,"IsPrimary":true, "PhoneType":  {"Id":"2","DisplayName":"Office"},"PhoneNumber":"111111111","Extension":"","DisplayPhoneNumber":"111-111-1111"},{"PhoneNumberId":127437,"ContactId":22222,"IsPrimary":false,"PhoneType":{"Id":"3","DisplayName":"Fax"},"PhoneNumber":"111111111","Extension":null,"DisplayPhoneNumber":"111-111-1111"},{"PhoneNumberId":173825,"ContactId":22222,"IsPrimary":false,"PhoneType":{"Id":"4","DisplayName":"Mobile"},"PhoneNumber":"111111111","Extension":"","DisplayPhoneNumber":"111-111-1111"}]

需求

在TypeScript中过滤PhoneTypesAll,仅保留未出现在PhoneTypesSelected中的电话类型,期望结果:

[{"Id":"1","DisplayName":"Home"},{"Id":"5","DisplayName":"Other"}]

错误的尝试代码

this.sourcePhoneTypes = this.PhoneTypesAll.filter(item => !this.PhoneTypesSelected.some(itemToBeRemoved => itemToBeRemoved['Id'] == item['Id']));

问题原因

PhoneTypesSelected中的每条记录,电话类型的Id嵌套在PhoneType对象内部,并非顶层属性,所以itemToBeRemoved['Id']会获取到undefined,导致过滤逻辑完全失效。

正确实现代码

this.sourcePhoneTypes = this.PhoneTypesAll.filter(item => 
  !this.PhoneTypesSelected.some(selected => selected.PhoneType.Id === item.Id)
);

性能优化(数据量大时推荐)

如果PhoneTypesSelected数据量较大,先提取所有已选中的Id存入Set,可大幅提升过滤效率:

const selectedTypeIds = new Set(this.PhoneTypesSelected.map(selected => selected.PhoneType.Id));
this.sourcePhoneTypes = this.PhoneTypesAll.filter(item => !selectedTypeIds.has(item.Id));

内容的提问来源于stack exchange,提问作者Jeff O'Connell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:52:17