javascript - 从有序的字符串数组及其在 JavaScript 中的关系创建父子树状对象数组
问题描述
我有一个对象数组,其中每个对象都有一个属性 ( parentsList
),指示当前项目所属的类别,例如:
const data = [
{
...other properties,
"parentsList": [
"Assets",
"Icons"
],
},
{
...other properties,
"parentsList": [
"Assets",
"Fonts"
],
},
{
...other properties,
"parentsList": [
"Programming",
"JavaScript",
"Docs"
],
},
{
...other properties,
"parentsList": [
"Programming",
"JavaScript",
"React",
"Libraries",
],
},
]
这意味着第一个对象属于assets/icons
,第二个属于assets/fonts
,第三个属于programming/javascript/docs
,依此类推。
我正在尝试将其映射到树状视图,其中兄弟姐妹应该在同一个父级下,例如:
const data = [
{
name: 'Assets',
id: 'assets',
children: [
{
name: 'Icons',
id: 'assets/icons',
},
{
name: 'Illustrations',
id: 'assets/illustrations',
},
],
},
{
name: 'Programming',
id: 'programming',
children: [
{
name: 'JavaScript',
id: 'programming/javascript',
children: [
{
name: 'Docs',
id: 'programming/javascript/docs',
},
{
name: 'React',
id: 'programming/javascript/react',
children: [
{
name: 'Libraries',
id: 'programming/javascript/react/libraries',
},
],
},
],
},
],
},
]
我想从右边穿过会更容易,也许用reduceRight()
,但我似乎无法做到正确。
任何人都知道如何实现这一目标?
谢谢!
解决方案
您可以结合使用forEach
和reduce
并基于parentsList
数组创建嵌套层次结构。
const data = [{"parentsList":["Assets","Icons"]},{"parentsList":["Assets","Fonts"]},{"parentsList":["Programming","JavaScript","Docs"]},{"parentsList":["Programming","JavaScript","React","Libraries"]}]
const result = []
data.forEach(function({ parentsList, ...rest }) {
let id = '';
parentsList.reduce((r, name, i) => {
id += (id.length ? '/' : '') + name.toLowerCase();
if (!r[name]) {
const value = { id, name }
r[name] = {result: []}
if (i != parentsList.length - 1) {
value.children = r[name].result
} else {
Object.assign(value, rest)
}
r.result.push(value)
}
return r[name]
}, this)
}, {result})
console.log(result)
推荐阅读
- javascript - 解决 Javascript Promises 列表 - 按顺序?
- php - 如何连接到 Laravel 中的另一个数据库(多数据库 HUNDREDS)
- c# - 如何制作列表中具有非空字段的元素编号列表?
- python - Django 代码中 Q 对象中 query.connector 的值如何设置?
- ms-media-foundation - 如何在 mediafoundation source Reader 和 sink writer 中支持 mxf 文件格式
- python - 如何访问表中的某些数据?
- python - 使用 python 将 XML 转换为 Json 并触发 post API 请求
- php - 无法传递数组数据
- android - 如何使用大单行文本将 ButtonView 定位到 TextView 的末尾,而不是将其移出屏幕
- android - Android Activity 不会停止服务和位置更新