如何将一个对象数组的树结构克隆到另一个对象,使其与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[]
进行操作,然后在数组中每个InputTree
的children
上递归调用自己。像这样:
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吗?关于如何实现这一点,有很多例子(:
的第一个例子
的第二个例子
如果你不能使用它,我会深入研究代码,看看他们是如何实现的(: