javascript - 循环遍历 json 树对象并创建新数组
问题描述
有没有一种好方法 JS/ES6 来循环一个对象及其子对象并创建新的对象树数组。
我有这个 json 树对象:
[
{
id: "001",
deparmentsIds: [
"002",
"003"
],
details: {
parentDeparmentsId: null,
name: "Top"
}
},
{
id: "002",
deparmentsIds:[
"004"
],
details: {
parentDeparmentsId: ["001"],
name: "Operations"
}
},
{
id: "003",
deparmentsIds:[]
details: {
parentDeparmentsId: ["001"],
name: "Support"
}
},
{
id: "004",
deparmentsIds:[]
details: {
parentDeparmentsId: ["002"],
name: "Support operations"
}
}
]
解决方案
reduce
您可以使用和方法创建递归函数map
来创建嵌套对象结构。
const data = [{"id":"001","deparmentsIds":["002","003"],"details":{"parentDeparmentsId":null,"name":"Top"}},{"id":"002","deparmentsIds":["004"],"details":{"parentDeparmentsId":"001","name":"Operations"}},{"id":"003","deparmentsIds":[],"details":{"parentDeparmentsId":"001","name":"Support"}},{"id":"004","deparmentsIds":[],"details":{"parentDeparmentsId":"002","name":"Support operations"}}]
function tree(input, parentId) {
return input.reduce((r, e) => {
if (e.id == parentId || parentId == undefined && e.details.parentDeparmentsId == null) {
const children = [].concat(...e.deparmentsIds.map(id => tree(input, id)))
const obj = {
[e.details.name]: children
}
r.push(obj)
}
return r;
}, [])
}
const result = tree(data)
console.log(result)
推荐阅读
- c++ - 如何使用 range-v3 库从 std::vector 获取列视图和行视图?
- c - 为什么可以在 C 中生成动态大小的数组?
- python - 如何使用Python将各个数字的索引存储在单独数组中的列表中
- java - Kafka Consumer架构设计:java插件或外部客户端
- dynamics-crm - CRM 操作中的可选输入参数在代码活动中始终为 NULL,即使未通过?
- powershell - 用户通过 powershell 脚本插入后 CN 中的“\”字符
- ssrs-2016 - 在 iif 子句条件中连接多个字段时,在 SSRS 报告生成器 2016 中显示错误
- ios - 如何在 UITextField 上显示验证错误?
- python - 如何在列表列表中找到列表的名称而不是其值?
- react-native - 由于旧的 react-native-vector-icons 版本,无法构建 react-native-elements