如何根据匹配值移除嵌套对象数组中active为0的非活跃对象
问题根因
你的代码没有生效是两个逻辑错误导致的:
- 外层
clusters.filter()的判断条件不符合预期:Array.filter()需要回调返回布尔值决定当前元素是否保留,但你在回调里直接返回了cluster.goals.filter(goal => goal.active === 1)的执行结果——这个结果是一个数组,JS里空数组也属于真值,因此外层所有cluster项都会被保留,不会触发过滤。 - 内层对goals的过滤结果没有被赋值回原cluster对象,相当于过滤操作执行完就被丢弃了,原数据结构自然不会发生任何变化。
正确实现
你需要先遍历每个cluster项,过滤掉其下active为0的goal,再将过滤后的goals数组更新到cluster中返回即可,推荐用不修改原数据的纯函数写法:
public stripGoalsByInactiveGoals(clusters) { return clusters.map(cluster => { // 过滤当前分组下的活跃目标 const activeGoals = cluster.goals.filter(goal => goal.active === 1); // 返回新对象,避免直接修改原数据源产生副作用 return { ...cluster, goals: activeGoals }; }); }
如果你的需求还包含「某个cluster下所有goal都为非活跃时,直接移除整个cluster」,只需要在后面追加一层过滤即可:
public stripGoalsByInactiveGoals(clusters) { return clusters .map(cluster => ({ ...cluster, goals: cluster.goals.filter(goal => goal.active === 1) })) // 移除没有任何活跃目标的分组 .filter(cluster => cluster.goals.length > 0); }
执行效果
传入你提供的示例数据,执行后返回的结果如下,完全符合剔除active=0对象的要求:
[ { "id": 1, "title": "list of...", "goals": [ { "id": 1570, "active": 1 } ] }, { "id": 2, "title": "more goals", "goals": [ { "id": 1070, "active": 1 } ] } ]
内容的提问来源于stack exchange,提问作者user759235
相关产品推荐
相关产品推荐

