当前位置: 首页 > 知识库问答 >
问题:

javascript - 扁平化数组转换成树形?

鱼安然
2024-04-30

背景:

需要将扁平化数组转换成树形数组。

比如原始数组如下:

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"                    }                ]            }        ]    }]

共有5个答案

龚沛
2024-04-30

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"          }        ]      }    ]  }]
佘缪文
2024-04-30
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!
王伯寅
2024-04-30
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}
汪建德
2024-04-30
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}
闻修筠
2024-04-30

要将扁平化数组转换成树形数组,你可以使用递归的方法来构建树结构。以下是一个可能的实现:

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转换为一个