求助:使用JavaScript数组方法实现对象数组的指定条件过滤
用数组方法改写JavaScript过滤逻辑
需求:过滤数组中的对象,保留以下两类对象:
- 对象的
programParent为空字符串 - 对象的
id被其他对象的programParent字段引用
原实现代码(嵌套循环版本):
let programsRes = [ { id: '23', name: 'ventas', programParent: '' }, { id: '24', name: 'ventas OUT Personal', programParent: '23' }, { id: '25', name: 'ventas OUT Personal plus', programParent: '24' }, { id: '26', name: 'ventas IN Hogares', programParent: '23' }, { id: '27', name: 'Ad Hoc', programParent: '' }, { id: '28', name: 'Ad Hoc asd', programParent: '27' }, { id: '29', name: 'Ad Hoc 123', programParent: '27' }, { id: '30', name: 'ventas IN Personal plus', programParent: '26' }, ] let expected = [ { id: '23', name: 'ventas', programParent: '' }, { id: '24', name: 'ventas OUT Personal', programParent: '23' }, { id: '26', name: 'ventas IN Hogares', programParent: '23' }, { id: '27', name: 'Ad Hoc', programParent: '' }, ] let result = [] for (let i = 0; i < programsRes.length; i++) { for (let j = 0; j < programsRes.length; j++) { if (programsRes[i].programParent === '') { result.push(programsRes[i]) break; } if (programsRes[i].id === programsRes[j].programParent) { result.push(programsRes[i]) break; } } } console.log(result)
改写后的数组方法实现版本
const programsRes = [ { id: '23', name: 'ventas', programParent: '' }, { id: '24', name: 'ventas OUT Personal', programParent: '23' }, { id: '25', name: 'ventas OUT Personal plus', programParent: '24' }, { id: '26', name: 'ventas IN Hogares', programParent: '23' }, { id: '27', name: 'Ad Hoc', programParent: '' }, { id: '28', name: 'Ad Hoc asd', programParent: '27' }, { id: '29', name: 'Ad Hoc 123', programParent: '27' }, { id: '30', name: 'ventas IN Personal plus', programParent: '26' }, ]; // 提取所有对象的programParent值,用于快速判断引用关系 const parentIds = programsRes.map(item => item.programParent); const result = programsRes.filter(item => { // 条件1:programParent为空字符串,直接保留 if (item.programParent === '') { return true; } // 条件2:当前对象的id被其他对象的programParent引用,保留 return parentIds.includes(item.id); }); console.log(result);
实现说明
- 预提取父ID集合:用
map方法一次性获取所有对象的programParent值存入数组,避免了嵌套循环里重复遍历的冗余操作,提升判断效率。 - 过滤逻辑:使用
filter方法遍历原数组,对每个对象执行两个条件判断,满足任一条件则保留该对象,最终得到符合要求的结果数组。
内容的提问来源于stack exchange,提问作者sonEtLumiere
相关产品推荐
相关产品推荐

