代码之家  ›  专栏  ›  技术社区  ›  allanberry Michael Palmer

使用递归/减少从数组创建对象?

  •  -1
  • allanberry Michael Palmer  · 技术社区  · 6 年前

    我只是有点讨厌递归函数。

    const input = { regions: ["US", "CA", "LA"], checked: true };
    

    …使用递归和 reduce

    const output = {
      US: {
        CA: {
          LA: true
        }
      }
    };
    

    帮忙?我试过很多东西,但我的实验太尴尬了,无法分享。

    2 回复  |  直到 6 年前
        1
  •  2
  •   CertainPerformance    6 年前

    在区域上迭代 reduceRight ,创建初始值为 checked

    const input = { regions: ["US", "CA", "LA"], checked: true };
    const { regions, checked } = input;
    
    const output = regions.reduceRight((a, prop) => ({ [prop]: a }), checked);
    console.log(output);
        2
  •  1
  •   Nick Parsons Felix Kling    6 年前

    这里不需要递归(我希望 .reduceRight )但是,这里有一种不同的方法,它使用递归函数,以防您对如何实现它感兴趣。您可以从数组中解构第一个元素并将其用作键,然后将该值设置为下一个将生成对象的调用。如果无法检索任何键,则可以返回 checked :

    const input = { regions: ["US", "CA", "LA"], checked: true };
    const getNested = ([key, ...r], end) => key ? {[key]: getNested(r, end)} : end;
    
    console.log(getNested(input.regions, input.checked));