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

JS数组过滤求助:剔除programParent对应存在id的对象

过滤JavaScript对象数组:剔除programParent对应其他对象id的项

我需要对一个JavaScript对象数组进行过滤,规则是如果某个对象的programParent属性值存在于数组中另一个对象的id属性里,就把这个对象剔除。下面是我写的代码和预期输出,帮忙修正代码。

原代码

let programs = [
    { id: '23', name: 'a', programParent: '111' },
    { id: '24', name: 'a', programParent: '112' },
    { id: '25', name: 'a', programParent: '113' },
    { id: '26', name: 'a', programParent: '24' },
    { id: '27', name: 'a', programParent: '25' },
    { id: '28', name: 'a', programParent: '111' },
    { id: '29', name: 'a', programParent: '28' }
]


let options = programs.filter(x => programs.some(y => y !== x.programParent))
console.log(options)

预期输出

expected = [
    { id: '23', name: 'a', programParent: '111' },
    { id: '24', name: 'a', programParent: '112' },
    { id: '25', name: 'a', programParent: '113' },
    { id: '28', name: 'a', programParent: '111' }
]

修正方案

你的原代码逻辑错误:programs.some(y => y !== x.programParent)中,y是数组里的对象,和字符串类型的x.programParent比较永远为true,所以过滤后还是原数组。

正确做法是先提取所有对象的id到集合中,再判断当前对象的programParent是否不在这个集合里:

let programs = [
    { id: '23', name: 'a', programParent: '111' },
    { id: '24', name: 'a', programParent: '112' },
    { id: '25', name: 'a', programParent: '113' },
    { id: '26', name: 'a', programParent: '24' },
    { id: '27', name: 'a', programParent: '25' },
    { id: '28', name: 'a', programParent: '111' },
    { id: '29', name: 'a', programParent: '28' }
]

// 提取所有id存入Set,提升查找效率
const idSet = new Set(programs.map(item => item.id));
// 过滤出programParent不在id集合中的项
let options = programs.filter(x => !idSet.has(x.programParent));
console.log(options);

说明

用Set存储id是因为它的has方法时间复杂度为O(1),比每次遍历数组的O(n)效率更高,尤其适合处理大型数组。运行这段代码后,输出结果会和你的预期完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:46:18