首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何递归迭代JS对象,同时创建一个具有类似结构的新对象?

如何递归迭代JS对象,同时创建一个具有类似结构的新对象?
EN

Stack Overflow用户
提问于 2018-08-05 18:53:02
回答 1查看 59关注 0票数 0

我正在尝试创建一个对象的“组合”,其中每个对象都有一些属性,以及对其他对象的引用(让我们将它们视为“孩子”);

这个复合结构是从一个配置对象创建的,该对象对结构进行布局。例如:

代码语言:javascript
复制
const configObj = {

    baseSiteUrl: `https://example.com`,
    startUrl: `https://example.com/products`,
    type:'root',
    children: [
        {
            type: 'link',
            name: '.product_name_link',
            children: [
                {
                    type: 'data',
                    name: '.product_publisher'
                }

            ]
        }
    ]

}

我需要将这种结构转换为对象实例的实际组合(我有" Link“和" Data”类,每个类都有不同的用途:Link向该地址发送HTTP请求,Data获取某个元素)。

到目前为止,我所尝试的是一个纯粹可笑的黑客技巧。这是我的递归函数:

代码语言:javascript
复制
function createObjectsFromTree(object) {
    const classReference = getClassMap()[object.type];//Brings a reference to the appropriate class.

    if(object.type !== 'root'){
        object.actualObject = new classReference(object.name, object.children || null);//This is the hack: it just creates a property called "actualObject", on the original object. 
    }       

    if (!object.children) {
        return;
    }

    object.children.forEach((child) => {        

        createObjectsFromTree(child)
    })

}

 createObjectsFromTree(configObj);//Making the initial call

这是getClassMap函数:

代码语言:javascript
复制
 function getClassMap() {
    return {
        link: Link,
        root:Root,
        data: Data
    }

}

正如您所看到的,我只是修改了原始的配置对象,添加了一个"actualObject“属性,该属性将一个实例保存到一个对象中,此过程会自行重复此过程。

这显然是完全有缺陷的,只会导致问题,并使我的代码不可维护。

根据配置“蓝图”,我如何创建一个新的对象组合?

在控制台中,新对象应该如下所示:

代码语言:javascript
复制
{

    baseSiteUrl: `https://example.com`,
    startUrl: `https://example.com/products`,
    type:'root',
    children: [
        Link{// "Link" is the class name                
            name: '.product_name_link',
            children: [
                Data{// "Data" is the class name                         
                    name: '.product_publisher'
                }

            ]
        }
    ]

}

任何想法都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-06 07:15:53

我试着让它尽可能的简短。我假设你想要实现这样的事情:

代码语言:javascript
复制
function createObjectsFromTree(object) {
  let Class = getClassMap()[object.type];
  return new Class(
    object.name,
    (object.children || []).map(createObjectsFromTree)
  );
}

这是一个JSFiddle

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51693632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档