如何基于JSON对象中的多个值过滤JavaScript对象数组
数组多条件过滤实现方法
实现思路
你现有代码已经完成了myId对应元素的排除,只需要在过滤逻辑里追加第二个判断规则:当前元素的id不能存在于allIds数组所有元素的subId值列表中。
为了提升判断效率,建议先把所有需要排除的subId提前提取为Set结构,避免每次过滤循环都重复遍历allIds数组做查找。
完整可运行代码
const list = [ {id: 100, desc: 'Apple'}, {id: 555, desc: 'Banana'}, {id: 110, desc: 'Orange'}, {id: 120, desc: 'Strawberry'} ] const myObj = { "res": { "myId": 555, "allIds": [ {"subId": 100}, {"subId": 120} ] } } // 提前提取所有要排除的subId,用Set存储实现O(1)时间复杂度的查找 const excludeSubIds = new Set(myObj.res.allIds.map(item => item.subId)); const targetMyId = myObj.res.myId; // 过滤时同时校验两个排除条件 const filteredArr = list.filter(el => el.id !== targetMyId && !excludeSubIds.has(el.id)); console.log(filteredArr) // 输出 [{id: 110, desc: 'Orange'}],和预期结果一致
补充说明
- 你原有代码存在一处小语法问题:
list.filter(...)外层多余包裹了一层大括号,直接将filter返回值赋值给变量即可,不需要额外套大括号,否则会触发语法错误。 - 如果数据量非常小,也可以不用Set,直接在过滤回调里用
some判断:
这种写法不需要提前提取排除id列表,但是每次过滤都会遍历const filteredArr = list.filter(el => { return el.id !== myObj.res.myId && !myObj.res.allIds.some(idItem => idItem.subId === el.id) })allIds数组,数据量大的时候性能不如提前转Set的方案。
内容的提问来源于stack exchange,提问作者ArthurJ
相关产品推荐
相关产品推荐

