【JavaScript】数组转树形结构

【JavaScript】数组转树形结构

数组转树形结构方法

/**
* arr: 数组
* idStr:数组中每条数据的ID的key
* pidStr:数组中每条数据的父ID 的key
* chindrenStr:生成的树形结构链接key
* */
const transTreeData = function (arr, idStr, pidStr, chindrenStr) {
  let r = [],
    hash = {},
    id = idStr,
    pid = pidStr,
    children = chindrenStr,
    len = arr.length;
  for (let i = 0; i < len; i++) {
    hash[arr[i][id]] = arr[i];
  }
  for (let j = 0; j < len; j++) {
    let aVal = arr[j],
      hashVP = hash[aVal[pid]];
    if (hashVP) {
      !hashVP[children] && (hashVP[children] = []);
      hashVP[children].push(aVal);
    } else {
      r.push(aVal);
    }
  }
  return r;
}

步骤讲解

1、传入参数:
arr:数组;
idStr:数组中每条数据的ID的key;
pidStr:数组中每条数据的父ID 的key;
chindrenStr:生成的树形结构链接key;

2、方法逻辑详解
【1】定义中间参数
r:最后的树型结构的结果;
hash:数组转对象,以 id 为key;
id :转存idStr;
pid 转存pidStr;
children:转存 chindrenStr;
len:循环数组的长度,为传入数组的长度;
【2】把数组转成对象,以id为key,存入hash中;
【3】【1】把数组循环的当前项存入变量aVal 中;
【3】【2】从hash中取出当前循环的数组当前项的父类id的value;
【3】【3】判断是否存在父类,如果存在则将当前数组存入父类的子类;
【3】【4】如果不存在父类,则直接将数据存入返回数组r中;

知识点

浅拷贝和深拷贝都只针对于引用数据类型,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存;但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象;
区别:浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制;
以上数组转树结构,因为是浅拷贝,所以可以实现两个循环就生成无限级树形结构的数组。

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过递归实现将一个普通的数组换成树形结构。具体实现步骤如下: 1. 创建一个空的树形结构对象,用于存储换后的结果。 2. 遍历数组,对于每一个元素,判断它是否为根节点,即它的父节点是否为 null 或 undefined。如果是根节点,则将其作为树形结构的根节点,否则将其作为某个节点的子节点。 3. 如果当前元素不是根节点,则需要遍历树形结构,找到它应该作为子节点的节点。可以通过递归实现这一步骤,从根节点开始遍历整个树形结构,找到第一个满足条件的节点,将当前元素作为它的子节点。 4. 重复步骤 2 和 3,直到数组中的所有元素都被处理完毕。 以下是一个示例代码: ```javascript function arrayToTree(arr, parentId) { const tree = []; for (let i = 0; i < arr.length; i++) { const node = arr[i]; if (node.parentId === parentId) { const children = arrayToTree(arr, node.id); if (children.length > 0) { node.children = children; } tree.push(node); } } return tree; } ``` 在上面的代码中,`arr` 是需要换的数组,`parentId` 是当前节点的父节点 ID。在遍历数组时,判断当前节点的 `parentId` 是否等于 `parentId`,如果是,则将其加入到树形结构中,并递归处理它的子节点。如果不是,则跳过该节点。 需要注意的是,上面的代码并没有对数组进行排序,如果需要按照某种顺序构建树形结构,需要对数组进行排序。另外,上面的代码只是一个简单的示例,实际应用中可能需要进行一些优化,例如使用哈希表存储节点,避免重复遍历等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值