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

如何在JavaScript嵌套数组中用嵌套filter筛选canceled为false的costBreakdowns

问题原因

你的外层filter()回调返回的是内层filter()生成的数组,而在JavaScript中任何数组(即使是空数组)都是真值。由于filter()会保留回调返回真值的元素,所以所有分组都会被保留,导致筛选看似无效。

解决方案

根据你的需求,分两种情况处理:

情况1:保留所有分组,仅过滤每组中已取消的费用明细

如果你想保留所有分组(即使过滤后该分组没有剩余费用明细),只需要用map()替换外层的filter(),同时在每个分组内过滤costBreakdowns:

const filteredGroups = a.activeBookingsCostBreakdownGroups.map(group => ({
  ...group,
  costBreakdowns: group.costBreakdowns.filter(item => item.canceled === false)
}));

console.log(filteredGroups);

这段代码会遍历每个分组,复制原分组的所有属性,并将costBreakdowns替换为仅包含未取消项的列表。

情况2:仅保留包含未取消费用明细的分组

如果你想剔除那些过滤后没有剩余费用明细的分组,可以先通过filter()筛选出符合条件的分组,再用map()清理每组的costBreakdowns:

const filteredGroups = a.activeBookingsCostBreakdownGroups
  .filter(group => group.costBreakdowns.some(item => !item.canceled))
  .map(group => ({
    ...group,
    costBreakdowns: group.costBreakdowns.filter(item => !item.canceled)
  }));

console.log(filteredGroups);

这里some()会检查分组中是否存在至少一个未取消的费用明细(返回布尔值,符合filter()的回调要求),之后map()再过滤每组的费用明细。

优化版(单次遍历)

如果追求性能,可以用reduce()一次性完成筛选和转换,避免两次遍历分组:

const filteredGroups = a.activeBookingsCostBreakdownGroups.reduce((acc, group) => {
  const validBreakdowns = group.costBreakdowns.filter(item => !item.canceled);
  if (validBreakdowns.length > 0) {
    acc.push({ ...group, costBreakdowns: validBreakdowns });
  }
  return acc;
}, []);

console.log(filteredGroups);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:25:23