JavaScript/TypeScript如何实现无突变递归从嵌套对象构建ID数组
无突变递归实现方案
调整后完全消除了数组可变操作,全程返回新数组,符合函数式无突变原则,完整代码如下:
interface SubscriptionParams { selectedProduct?: SubscriptionSelectedProduct; } interface SubscriptionSelectedProduct { productId?: string; pricingId?: string; childProduct?: SubscriptionSelectedProduct; } // 递归收集当前节点及所有子节点的产品ID,返回全新数组,无任何入参修改 function collectProductIds(product?: SubscriptionSelectedProduct): string[] { // 节点不存在/无产品ID时直接返回空数组 if (!product?.productId) return []; // 拼接当前ID和子节点返回的ID数组,每次都是生成新数组,无突变 return [product.productId, ...collectProductIds(product.childProduct)]; } function subscriptionProductsIds(subscription: SubscriptionParams): string[] { return collectProductIds(subscription.selectedProduct); }
改动说明
- 移除了原有接收可变数组参数的递归逻辑,改为让递归函数自身返回对应层级的ID数组
- 全程使用数组展开运算符合并结果,没有
push等修改原数组的操作,不会修改任何入参 - 去掉了冗余的非空断言逻辑,容错性更高,如果你的业务场景确定
productId一定存在,可以自行加回非空断言!
内容的提问来源于stack exchange,提问作者Emilis
相关产品推荐
相关产品推荐

