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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (223)

我试图创建一个对象的“组合”,其中每个对象都有一些属性,以及对其他对象的引用(让我们把它们看作是“子对象”);

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

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”类,每个类都有不同的用途:链接向该地址发送HTTP请求,数据获取某个元素)。

到目前为止,我尝试的是hack。这是我的递归函数:

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函数:

 function getClassMap() {
    return {
        link: Link,
        root:Root,
        data: Data
    }

}

正如您所看到的,我只是在修改原始的config对象,添加了一个“ActualObject”属性,它将一个实例保存到一个对象中,这个过程会重复它。

这显然是完全错误的,只会导致问题,并使我的代码无法维护。

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

在控制台中,新对象应该是这样的:

{

    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'
                }

            ]
        }
    ]

}

任何想法都将不胜感激!

提问于
用户回答回答于

我试图使它尽可能短。我想你是想实现这样的目标:

function createObjectsFromTree(object) {
  let Class = getClassMap()[object.type];
  return new Class(
    object.name,
    (object.children || []).map(createObjectsFromTree)
  );
}

代码:https://jsfiddle.net/hb40gxkc/19/

扫码关注云+社区

领取腾讯云代金券