javascript - 将数组转换为树
问题描述
有一个数据数组需要转换成树:
const array = [{
id: 5,
name: 'vueJS',
parentId: [3]
}, {
id: 6,
name: 'reactJS',
parentId: [3]
}, {
id: 3,
name: 'js',
parentId: [1]
}, {
id: 1,
name: 'development',
parentId: null
}, {
id: 4,
name: 'oracle',
parentId: [1,2]
}, {
id: 2,
name: 'data-analysis',
parentId: null
}];
现在它使用这个函数工作:
function arrayToTree(array, parent) {
var unflattenArray = [];
array.forEach(function(item) {
if(item.parentId === parent) {
var children = arrayToTree(array, item.id);
if(children.length) {
item.children = children
}
unflattenArray.push(item)
}
});
return unflattenArray;
}
console.log(arrayToTree(array, null));
我对这个功能有两个问题:
- “parentId”的值应该是一个id的数组,例如 - “parentId”: [2, 3]
- 如何仅将一个参数传递给函数-“数组”?
解决方案
我觉得这个问题令人困惑。听起来您真正想说的是数组表示“树中节点类型的定义”,而不是树中那些节点的实际实例。
所以你的问题是你需要将数组中的“定义”复制到树中的新“实例”节点。这将使“Oracle”显示两次,因为您将为其父数组中的每个父节点创建一个新的“oracle 实例”节点。根据您的使用情况,它在技术上不需要是深层副本,因此您可以使用 Object.assign 进行概念证明,但每个实例都将指向同一个父数组,并且可能会或可能不会导致该或将来参考的问题添加到定义中的值。
最后,根据树的大小和您真正想要做的事情,您可能希望转换为由节点/边而不是父/子表示的树。对于非常大的数据集,递归有时会给您带来问题。
抱歉,我在用手机,所以有些东西在 codepen 上很难看到。
推荐阅读
- ionic-framework - 是否有错误运行 ionic serve 错误:无法清理到目录 Eperm :www\build\15.js 中不允许操作
- ruby-on-rails - 未为子模型保存关联记录
- terraform - Terraform 删除旧的 AWS Lambda 层版本而不是创建新版本
- css - 在 react.js 中单击按钮时如何更改按钮图标
- angular - 单击任何产品时在网格内插入其他产品
- machine-learning - 在 mlr 中调整分类阈值
- java - Grails/GORM 动态查找器通过其关系 ID 而不是关系对象本身获取域
- ios - iPhone XR 和 iPhone XS 的 Peek and Pop
- autodesk-forge - Autodesk 的 adsk-icon-* 类
- android - Places.GeoDataApi setResultCallback 不起作用