当仅知道 "depth" 而不是 "parent ID" 时,从平面有序数组构建树数组
Build tree array from flat ordered array when only "depth" and NOT "parent ID" is known
this thread 和我搜索过的其他地方的答案只有在“parent_id”对于数组中的每个对象都是已知的情况下才有效。
如果对象的唯一 属性 是 depth
怎么办?
深度本质上告诉我该项目是“根节点”(depth
of 1)还是“子节点”(depth
of 2 或更多)。
如果前面的对象具有较小的 depth
,则子对象的父对象是直接在它之前的对象。 (父级的深度应始终比其子级多 1。)
如果一个对象与前面的对象具有相同的depth
,则它们实际上是同一级别的兄弟
如果前面的对象具有更高的 depth
,则当前项实际上是具有相同 depth
的最早的前面项的兄弟项(或者您也可以将其视为具有较低 depth
)
的最早的前一项的子项
例如
// Please note "name" in the example below
// is just for illustrative purposes.
// My actual array will have random names
const items = [
{
name: "1",
depth: 1,
},
{
name: "2",
depth: 1,
},
{
name: "2_1",
depth: 2,
},
{
name: "2_1_1",
depth: 3,
},
{
name: "2_1_2",
depth: 3,
},
{
name: "2_2",
depth: 2,
},
]
所以我想将该平面数组转换为树形结构,例如:
const newItems = [
{
name: "1",
depth: 1,
children: [],
},
{
name: "2",
depth: 1,
children: [
{
name: "2_1",
depth: 2,
children: [
{
name: "2_1_1",
depth: 3,
children: [],
},
{
name: "2_1_2",
depth: 3,
children: [],
},
],
},
{
name: "2_2",
depth: 2,
children: [],
},
],
},
]
您可以为关卡获取辅助数组并将对象分配给 depth
的最新数组。
const
items = [{ name: "1", depth: 1 }, { name: "2", depth: 1 }, { name: "2_1", depth: 2 }, { name: "2_1_1", depth: 3 }, { name: "2_1_2", depth: 3 }, { name: "2_2", depth: 2 }],
tree = [],
levels = [tree];
items.forEach(o =>
levels[o.depth - 1].push({ ...o, children: levels[o.depth] = [] })
);
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
this thread 和我搜索过的其他地方的答案只有在“parent_id”对于数组中的每个对象都是已知的情况下才有效。
如果对象的唯一 属性 是 depth
怎么办?
深度本质上告诉我该项目是“根节点”(depth
of 1)还是“子节点”(depth
of 2 或更多)。
如果前面的对象具有较小的 depth
,则子对象的父对象是直接在它之前的对象。 (父级的深度应始终比其子级多 1。)
如果一个对象与前面的对象具有相同的depth
,则它们实际上是同一级别的兄弟
如果前面的对象具有更高的 depth
,则当前项实际上是具有相同 depth
的最早的前面项的兄弟项(或者您也可以将其视为具有较低 depth
)
例如
// Please note "name" in the example below
// is just for illustrative purposes.
// My actual array will have random names
const items = [
{
name: "1",
depth: 1,
},
{
name: "2",
depth: 1,
},
{
name: "2_1",
depth: 2,
},
{
name: "2_1_1",
depth: 3,
},
{
name: "2_1_2",
depth: 3,
},
{
name: "2_2",
depth: 2,
},
]
所以我想将该平面数组转换为树形结构,例如:
const newItems = [
{
name: "1",
depth: 1,
children: [],
},
{
name: "2",
depth: 1,
children: [
{
name: "2_1",
depth: 2,
children: [
{
name: "2_1_1",
depth: 3,
children: [],
},
{
name: "2_1_2",
depth: 3,
children: [],
},
],
},
{
name: "2_2",
depth: 2,
children: [],
},
],
},
]
您可以为关卡获取辅助数组并将对象分配给 depth
的最新数组。
const
items = [{ name: "1", depth: 1 }, { name: "2", depth: 1 }, { name: "2_1", depth: 2 }, { name: "2_1_1", depth: 3 }, { name: "2_1_2", depth: 3 }, { name: "2_2", depth: 2 }],
tree = [],
levels = [tree];
items.forEach(o =>
levels[o.depth - 1].push({ ...o, children: levels[o.depth] = [] })
);
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }