js将一维数组转换为二维数组

本文介绍了如何使用JavaScript的`to2DArray`函数,将一维数组按照给定的子数组长度进行分割,生成二维数组。该函数通过`Array.from`和`slice`方法实现,如将`[1,2,3,4,5,6,7,8,9,10,11,12]`转换为`[[1,2,3,4],[5,6,7,8],[9,10,11,12]]`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


function to2DArray(arr, subArrayLength) {
    return Array.from({ length: Math.ceil(arr.length / subArrayLength) }, (_, i) =>
        arr.slice(i * subArrayLength, i * subArrayLength + subArrayLength)
    );
}
 
// 示例
const oneDArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
const twoDArray = to2DArray(oneDArray, 4);
console.log(twoDArray);
// 输出: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
<think>好的,用户想要用JavaScript根据parentId把一维数组成树形结构。我之前有处理过类似的问题,应该可以用哈希表的方法。先看看用户提供的引用内容,里面有几个例子,比如convertToTree函数和buildTree函数,都是通过哈希表存储节点,然后建立父子关系。 首先,我需要确认用户的需求。他们提到使用parentId字段,所以每个数据项应该包含id和parentId。根节点的parentId可能是null或者0,具体要看数据。比如引用里的数据例子,parentId为0的是顶级节点。 接下来,我需要设计步骤。第一步是遍历数组,创建哈希表,以id为键,存储节点信息,同时初始化children数组。这一步可以确保每个节点都能被快速访问。第二步是再次遍历数组,根据parentId将节点添加到对应的父节点的children中。对于parentId为0或null的节点,直接放到根节点的children里。 需要注意的是,可能有多个顶级节点,所以根节点应该是一个虚拟节点,最后返回它的children数组。另外,要处理循环引用或者无效parentId的情况,不过用户可能暂时不需要这些错误处理。 然后,参考用户提供的代码示例,convertToTree函数使用了类似的方法。用户提到的引用[1]和引用[2]都使用了哈希表来映射节点,然后建立父子关系。所以这个方法是可行的。 现在,具体实现的时候,需要确保每个节点被正确添加到父节点的children中。如果父节点不存在怎么办?比如parentId指向不存在的节点,这时候可能需要忽略或者处理错误,但用户可能希望默认作为顶级节点,或者不做处理。根据引用中的例子,似乎没有处理这种情况,所以代码可能假设所有parentId都是有效的。 测试一下,假设数据中有id和parentId,那么代码应该能正确构建树。例如,数据中的父节点必须先存在于哈希表中,否则子节点无法找到父节点。所以在处理顺序上,先创建所有节点到哈希表,然后再建立关系,这样可以避免父节点还未创建的问题。 另外,是否需要深拷贝数据?在引用中的代码,他们使用了{...item, children: []},这样是创建了新对象,避免修改原数据。这点需要注意,保持原数据不变。 总结步骤: 1. 创建哈希表,存储id到节点的映射,同时初始化children数组。 2. 创建虚拟根节点,用于收集所有顶级节点。 3. 遍历数组,将节点根据parentId添加到父节点的children,或者虚拟根节点的children。 4. 返回虚拟根节点的children作为结果。 现在,编写代码的时候,需要注意循环引用的可能,但通常数据应该不会有这种情况。用户的问题中可能不需要考虑这些边界情况,但代码需要基础的正确性。 最后,测试一下示例数据,比如引用里的data数组,转换后是否正确生成树形结构。例如,id为1的节点parentId是0,应该成为根节点的子节点,它的子节点包括id2、3等,这些在数据中parentId为1,所以会被添加到id1的children里。 所以最终的代码应该类似引用中的convertToTree函数,但根据用户的具体需求进行调整,比如parentId为0还是null,可能需要修改判断条件。用户的数据中parentId是0,所以代码中应该检查item.parentId === 0的情况,或者根据实际情况处理。</think>以下是根据`parentId`字段将一维数组转换为树形结构的实现方法: ### 实现步骤 1. **创建哈希表**:遍历原始数组,用`id`作为键存储节点引用,并为每个节点初始化`children`数组[^1][^2] 2. **建立父子关系**:再次遍历数组,根据`parentId`将节点挂载到父节点的`children`中[^1][^4] 3. **处理根节点**:将`parentId`为特定值(如`0`或`null`)的节点作为树根[^4] ### 代码实现 ```javascript function arrayToTree(items) { // 创建哈希表和虚拟根节点 const idMapping = {}; const root = { children: [] }; // 第一次遍历:建立哈希映射 items.forEach(item => { idMapping[item.id] = { ...item, children: [] }; }); // 第二次遍历:建立父子关系 items.forEach(item => { const node = idMapping[item.id]; if (item.parentId === 0 || item.parentId === null) { root.children.push(node); } else { const parent = idMapping[item.parentId]; parent?.children?.push(node); } }); return root.children; } // 使用示例 const flatData = [ { id: 1, name: '系统管理', parentId: 0 }, { id: 2, name: '用户管理', parentId: 1 }, { id: 3, name: '角色管理', parentId: 1 }, { id: 7, name: '个人中心', parentId: 0 } ]; console.log(JSON.stringify(arrayToTree(flatData), null, 2)); ``` ### 关键点说明 1. **时间复杂度**:$O(n)$,两次线性遍历即可完成转换[^1] 2. **空间复杂度**:$O(n)$,哈希表存储了所有节点引用[^2] 3. **虚拟根节点**:用于统一处理顶级节点,避免多次判断`parentId`是否为根节点标志[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值