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

双层数组过滤逻辑难题:保留上层结构并匹配子数组元素

双层数组过滤问题解决方案

原代码的核心问题

  • forEach无返回值且变量覆盖:forEach仅做遍历不生成新数组,且cards变量会被每次循环覆盖,最终只保留最后一次遍历的结果,丢失其他offer的过滤数据。
  • 未保留完整结构:没有将过滤后的offerCard赋值回对应offer对象,也没有收集处理后的offer来构建新的数组结构。
  • 未处理空结果的上层项:原逻辑没有过滤掉offerCard为空的上层offer,不符合示例中只保留有匹配结果的上层项的需求。

修正后的代码

// 提前统一转换过滤值为大写,避免重复转换
const upperFiltroValue = filtroValue.toUpperCase();

// 构建新结果,完整保留原上层结构
const filteredResult = {
  ...jsonArray, // 复制原对象的所有上层属性(如OpenClientIndicator)
  listTypeCreditOffer: jsonArray.listTypeCreditOffer
    .map(offer => {
      // 过滤当前offer下的符合条件的卡片
      const filteredCards = offer.offerCard.filter(card => {
        return card.idCard.toString().includes(upperFiltroValue) ||
               card.nameCard.toUpperCase().includes(upperFiltroValue);
      });
      // 返回新的offer对象,替换offerCard为过滤后的结果
      return { ...offer, offerCard: filteredCards };
    })
    // 过滤掉offerCard为空的上层offer(若需保留空项可删除此步骤)
    .filter(offer => offer.offerCard.length > 0)
};

代码说明

  • 结构完整保留:用扩展运算符...复制原对象的所有上层属性,确保不修改原数据且输出结构与输入一致。
  • map遍历处理:遍历每个上层offer,生成包含过滤后offerCard的新对象,避免污染原数组。
  • 空结果过滤:最后一步filter移除没有匹配卡片的上层offer,和你给出的示例输出完全一致;如果需要保留所有上层offer(即使其卡片列表为空),可直接删除此步。
  • 性能优化:提前转换过滤值为大写,避免在每次过滤判断中重复执行转换操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:07:18