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
相关产品推荐
相关产品推荐

