在Angular/TypeScript中对比数组属性过滤数组的实现方法
在Angular/TypeScript中过滤未分配的任务数组
我来给你捋捋怎么实现这个需求,其实分两步就能搞定,而且还能兼顾性能:
首先,我们可以先把已经被分配的任务ID提取出来,存到一个Set里——这玩意儿查找起来特别快,比直接遍历数组高效多了。然后再用数组的filter方法,把tasks里ID不在这个集合里的元素挑出来就行。
具体实现步骤
1. 先给数据定义类型(TypeScript规范操作)
为了让代码更严谨,我们可以先给两个数组的元素定义接口:
interface Task { ID: number; Address: string; Latitude: number; Longitude: number; } interface AgentTask { ID: number; AgentID: number; TaskID: number; }
2. 准备你的原始数据
const tasks: Task[] = []; tasks.push({ ID: 1, Address: "---", Latitude: 312313, Longitude: 21312 }); tasks.push({ ID: 3, Address: "---", Latitude: 312313, Longitude: 21312 }); const agentTasks: AgentTask[] = []; agentTasks.push({ ID: 2, AgentID: 2, TaskID: 1 });
3. 实现过滤逻辑
// 第一步:提取所有已分配的TaskID到Set中 const assignedTaskIds = new Set(agentTasks.map(agentTask => agentTask.TaskID)); // 第二步:过滤出未被分配的任务 const unassignedTasks = tasks.filter(task => !assignedTaskIds.has(task.ID)); // 输出结果就是你要的ID为3的任务 console.log(unassignedTasks);
为什么用Set而不是直接遍历?
如果你的agentTasks数组比较小,其实也可以用更简洁的写法:
const unassignedTasks = tasks.filter(task => !agentTasks.some(agentTask => agentTask.TaskID === task.ID) );
但这种写法每次过滤都要遍历一遍agentTasks数组,数据量大的时候性能会变差。而用Set的话,查找操作是O(1)的时间复杂度,整体效率会高很多,推荐在实际项目中用这个方案。
内容的提问来源于stack exchange,提问作者Hunzla Ali
相关产品推荐
相关产品推荐

