Typescript数组多过滤器实现:如何获取array1中不在array2、array3的元素
实现方案
方案1:直接合并判断条件(适合小数据量)
直接在filter的回调里用逻辑与&&拼接两个排除判断即可,单条语句就能完成需求:
如果你的数组元素是普通值(比如示例中的字符串),写法如下:
const result = array1.filter(item => !array2.includes(item) && !array3.includes(item));
如果你的数组元素是对象,需要比对id匹配,写法如下:
const result = array1.filter(element => !array2.some(ele => element.id === ele.id) && !array3.some(ele => element.id === ele.id));
方案2:用Set优化查询(适合大数据量)
如果数组元素较多,推荐先把需要排除的特征值(比如id、或者普通元素本身)存入Set,利用Sethas方法O(1)的查询效率提升性能,后续需要新增排除数组时也只要往Set的合并列表里加即可,扩展性更强:
普通值版本
const result = array1.filter(item => !new Set([...array2, ...array3]).has(item));
对象id匹配版本
const result = array1.filter(element => !new Set([...array2.map(i => i.id), ...array3.map(i => i.id)]).has(element.id));
如果不想每次循环都创建Set,也可以提前把Set定义出来,性能会更好:
const excludeIdSet = new Set([...array2.map(i => i.id), ...array3.map(i => i.id)]); const result = array1.filter(element => !excludeIdSet.has(element.id));
内容的提问来源于stack exchange,提问作者Frances
相关产品推荐
相关产品推荐

