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

如何基于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判断:
    const filteredArr = list.filter(el => {
      return el.id !== myObj.res.myId 
        && !myObj.res.allIds.some(idItem => idItem.subId === el.id)
    })
    
    这种写法不需要提前提取排除id列表,但是每次过滤都会遍历allIds数组,数据量大的时候性能不如提前转Set的方案。

内容的提问来源于stack exchange,提问作者ArthurJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:39:27