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

求助:使用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);

实现说明

  1. 预提取父ID集合:用map方法一次性获取所有对象的programParent值存入数组,避免了嵌套循环里重复遍历的冗余操作,提升判断效率。
  2. 过滤逻辑:使用filter方法遍历原数组,对每个对象执行两个条件判断,满足任一条件则保留该对象,最终得到符合要求的结果数组。

内容的提问来源于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 03:46:12