双层数组过滤逻辑难题:保留上层结构并匹配子数组元素
双层数组过滤问题解决方案
原代码的核心问题
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
相关产品推荐
相关产品推荐

