【问题标题】:JavaScript how to build array from nested Object using recursion without mutationJavaScript如何使用没有变异的递归从嵌套对象构建数组
【发布时间】:2022-01-04 11:04:13
【问题描述】:
interface SubscriptionParams {
  selectedProduct?: SubscriptionSelectedProduct;
}

interface SubscriptionSelectedProduct {
  productId?: string;
  pricingId?: string;
  childProduct?: SubscriptionSelectedProduct;
}

function getChildIdRecursively(product: SubscriptionSelectedProduct, ids: string[]) {
  if (product) {
    ids.push(product.productId!);
    product.childProduct && getChildIdRecursively(product.childProduct, ids);
  }
}

function subscriptionProductsIds(subscription: SubscriptionParams): string[] {
  let ids: string[] = [subscription.selectedProduct?.productId!];
  if (subscription.selectedProduct?.childProduct) {
    getChildIdRecursively(subscription.selectedProduct?.childProduct, ids);
  }

  return ids;
}

如何在没有变异的情况下进行这种递归,现在我正在变异 ids 数组。 我想遵循函数式编程原则

【问题讨论】:

  • 查看this Q&A 了解纯函数式方法

标签: javascript typescript functional-programming


【解决方案1】:

我认为您可以通过利用树遍历恕我直言来解决这个问题。

const collectIds = (node) => {
  const { id, children = [] } = node;
  
  // const children = [product.childProduct] in your specific case
  const ids = children.flatMap(collectIds);
  
  return [id, ...ids];
};


const product = {
  id: 'L1',
  children: [
    { id: 'L1.1' },
    { 
      id: 'L1.2', 
      children: [
        { id: 'L1.2.1', },
        { id: 'L1.2.2', },
        { id: 'L1.2.3', },
        { id: 'L1.2.4', },
        { id: 'L1.2.5', },
      ],
    },
  ],
};

console.log(
  collectIds(product),
);

【讨论】:

    【解决方案2】:

    我会避免创建很多不必要的中间数组,但每个数组都有自己的。使这个“不可变”就像从 getChildIdRecursively 返回一个新数组一样简单。此外,由于您基本上是在复制 subscriptionProductsIds 中的逻辑,您可以将其删除。

    function getChildIdRecursively(product: SubscriptionSelectedProduct) {
      if (product) {
        let ids: string[] = [product.productId!];
        if (product.childProduct) {
          ids = ids.concat(getChildIdRecursively(product.childProduct));
        }
        return ids;
      }
      return [];
    }
    
    function subscriptionProductsIds(subscription: SubscriptionParams): string[] {
      return getChildIdRecursively(subscription.selectedProduct)
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 2021-03-04
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2020-01-26
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多