gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:22:46 25 4
gpt4 key购买 nike

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

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

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 获取某个元素)。

到目前为止我所尝试的只是一个纯粹荒谬的黑客行为。这是我的递归函数:

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
}

}

如您所见,我只是修改原始配置对象,添加一个“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)
);
}

这是一个JSFiddle .

关于javascript - 如何递归迭代 JS 对象,同时创建具有类似结构的新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51693632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com