背景:
需要将扁平化数组转换成树形数组。
比如原始数组如下:
const arr = [ {id: 4, pid: 3}, {id: 'aa',pid:'a'}, {id: 1, pid: null}, {id: 3, pid: 2}, {id: 'a',pid: 'a0'}, {id: 2, pid: 1}, {id: 'a0',pid: null} ];
期望转换后的数据
[ { "id": 1, "pid": null, "children": [ { "id": 2, "pid": 1, "children": [ { "id": 3, "pid": 2, "children": [ { "id": 4, "pid": 3 } ] } ] } ] }, { "id": "a0", "pid": null, "children": [ { "id": "a", "pid": "a0", "children": [ { "id": "aa", "pid": "a" } ] } ] }]
js
代码arr.reduce((o, i) => { i = Object.assign(o[i.id] ??= {}, i); ((o[i.pid ?? ''] ??= {}).children ??= []).push(i); return o;}, {})['']?.children
[ { "id": 1, "pid": null, "children": [ { "id": 2, "pid": 1, "children": [ { "id": 3, "pid": 2, "children": [ { "id": 4, "pid": 3 } ] } ] } ] }, { "id": "a0", "pid": null, "children": [ { "id": "a", "pid": "a0", "children": [ { "id": "aa", "pid": "a" } ] } ] }]
type ID = string | number | nulltype Item = { id: ID; pid: ID; children?: Item[] }const mp = new Map<ID, Item>([[null, { id: null, pid: null, children: [] }]])const set = new Set<Item>(arr)while (set.size) set.forEach(i => { const p = mp.get(i.pid) if (p) { p.children ??= [] p.children.push(i) mp.set(i.id, i) set.delete(i) } })const transformed = mp.get(null)?.children!
const toTree = (items) => { const map = Object.fromEntries(items.map(item => [item.id, item])) const roots = [] items.forEach(item => { const { pid } = item if (pid === null) { roots.push(item) return } const parent = map[pid] if (! parent) throw `No item with id "${pid}"` ; (parent.children ??= []).push(item) }) return roots}
export const normalTree = data => { const map = {} const tree = [] const reduce = (list, item) => { const { id, pid, ...child } = item child.id = id if (!pid) list.push(child) map[id] = child return list } data.reduce(reduce, tree) const each = item => { const { id, pid } = item || {} const child = map[pid] if (child) { const { children } = child children ? map[pid].children.push(map[id]) : (map[pid].children = [map[id]]) } } data.forEach(each) return tree}
要将扁平化数组转换成树形数组,你可以使用递归的方法来构建树结构。以下是一个可能的实现:
function buildTree(arr, parentId = null) { const result = []; const temp = arr.filter(item => item.pid === parentId); temp.forEach(item => { const children = buildTree(arr, item.id); if (children.length) { item.children = children; } result.push(item); }); return result;}const arr = [ {id: 4, pid: 3}, {id: 'aa', pid: 'a'}, {id: 1, pid: null}, {id: 3, pid: 2}, {id: 'a', pid: 'a0'}, {id: 2, pid: 1}, {id: 'a0', pid: null}];const tree = buildTree(arr);console.log(JSON.stringify(tree, null, 2));
这段代码首先定义了一个buildTree
函数,它接受一个数组和一个可选的parentId
参数。parentId
默认为null
,表示从根节点开始构建树。函数内部首先通过filter
方法筛选出所有pid
等于parentId
的节点,然后对这些节点进行遍历。对于每个节点,递归调用buildTree
函数来构建其子树,并将结果赋值给item.children
。最后,将当前节点添加到结果数组中。最终,返回结果数组作为树的根节点。
在主程序中,我们调用buildTree
函数来构建树,并使用console.log
将结果输出到控制台。注意,为了更清晰地展示结果,我使用了JSON.stringify
函数将结果转换为格式化的JSON字符串。
运行以上代码,你将得到期望的转换后的树形数组。
我对递归是新手。我可以将数组展平并以普通数组的形式返回,但如果我想将数组展平并将其存储在对象中并返回值,由于某种原因,我会丢失前面结果的值,如果你能帮助我,那就太好了。PS:我可以通过每次迭代发送结果作为参数来做到这一点,但我想这样做,所以… 我甚至尝试了下面的方法,我知道我犯了一些错误,只是我找不到确切的位置 或
如我们所知,要使用方法对数组进行展平 那么如何将这个数组平坦化为呢?
我有一个类别树,由以下内容表示。 这给出了一个dataframe,如下所示: 树中最高的节点的parent_id等于-1,因此树可以用图形表示如下: 我需要生成以下DataFrame。 该树是动态生成的,可以具有任意数量的级别,因此下面的树 应产生以下结果:
本文向大家介绍Python分组扁平化列表,包括了Python分组扁平化列表的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序,将包含子列表的列表展开。给定的数字将子列表展开,直到给定的数字索引作为部分。让我们看一个例子来清楚地理解它。 输入项 输出结果 让我们看看解决问题的步骤。 初始化列表和编号。 初始化一个空列表。 使用范围(0,len(lists),number遍历列表
我正在研究一种递归算法,将二叉树扁平化为单链表。问题陈述: 我写了下面的递归代码,它根本不起作用(返回错误的答案),但我不能从概念上理解为什么不起作用。从根开始,我们拉平根。左根和右根。如果root.left存在,那么root.next(在本例中是root.right)将指向扁平化的left列表。然后,左列表指向右列表的开始。这将沿着树递归地继续下去。 这在概念上有问题吗?我尝试在预序遍历之后对它
本文向大家介绍Js数组扁平化实现方法代码总汇,包括了Js数组扁平化实现方法代码总汇的使用技巧和注意事项,需要的朋友参考一下 题目: 请写出一个数组拍平函数。效果如下: var arr=['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4]; flat(arr) //a,b,c,2,d,e,f,g,3,4 方法一:使用toString方法先将arr转换为一个