如何将一个对象数组的树结构克隆到另一个对象,并更改克隆对象的属性



如何将一个对象数组的树结构克隆到另一个对象,使其与TypeScript中克隆的对象具有不同或更少的属性?例如:

[
{
"name":"root_1",
"extradata":"whatever",
"anArray":[
{ "id":1, "value":"test" },
{ "id":1, "value":"test" }
],
"anObject":{ "id":1, "value":"test" },
"children":[
{
"name":"child_1",
"extradata":"whatever",
"anArray":[],
"anObject":{},
"children":[
{
"name":"root_1",
"extradata":"whatever",
"anArray":[],
"anObject":{},
"children":[]
},
{
"name":"root_1",
"extradata":"whatever",
"anArray":[],
"anObject":{},
"children":[]
}
]
}
]
},
{
"name":"root_2",
"extradata":"whatever",
"anArray":[],
"anObject":{},
"children":[]
}
]

我需要它的克隆,但不是";name";atribute";标签";,instad of";外部数据"="键";并且没有";anArray";以及";anObject";。像这样:

[
{
"label":"root_1",
"key":"whatever",
"children":[
{
"label":"child_1",
"key":"whatever",
"children":[
{
"label":"root_1",
"key":"whatever",
"children":[]
},
{
"label":"root_1",
"key":"whatever",
"children":[]
}
]
}
]
},
{
"label":"root_2",
"key":"whatever",
"children":[]
}
]

我需要克隆它,使用它作为原始树组件的数据格式。

我正在尝试类似的东西

this.myTree = tree.map((m, index) => Object.assign({}, {
label: m.name,
key: m.extradata,
children: m.children
}));

但是孩子们并没有遵循相同的形状。

我会通过首先为有问题的输入和输出类型定义接口来实现这一点:

interface InputTree {
name: string,
extradata: string,
anArray: any[],
anObject: object,
children: InputTree[]
}
interface OutputTree {
label: string,
key: string,
children: OutputTree[];
}

根据该定义,您的输入看起来是一个InputTree[],并且您希望生成一个OutputTree[]。树是递归的,因此应该编写一个treeMap()函数,该函数对InputTree[]进行操作,然后在数组中每个InputTreechildren上递归调用自己。像这样:

const treeMap = (inputTree: InputTree[]): OutputTree[] => inputTree.map(t => ({
label: t.name,
key: t.extradata,
children: treeMap(t.children)
}));
const actual = treeMap(tree);

您可以验证这是否会产生您期望的输出:

console.log(JSON.stringify(expected)===JSON.stringify(actual)); // true

游乐场链接到代码

我不确定您是否可以使用第三方库,但您听说过loadsh吗?关于如何实现这一点,有很多例子(:

的第一个例子

的第二个例子

如果你不能使用它,我会深入研究代码,看看他们是如何实现的(:

最新更新