javascript - 将基于子数组索引的数组数组合并为键(NodeJS/Javascript)
问题描述
如何编写代码以下列方式合并我的列表?性能很重要。我想转换以下数组:
"list": [
[
"marketing",
"page_sections",
"PageOne"
],
[
"marketing",
"page_sections",
"PageTwo"
],
[
"webapp",
"page",
"pageone"
],
[
"webapp",
"page",
"pagetwo"
],
转为以下格式:
[
{
name: "marketing",
path: "marketing/",
children: [
{
name: "page_sections",
path: "marketing/page_sections",
children: [
{
name: "pageOne",
path: "marketing/page_sections/pageOne",
children: []
},
{
name: "pageTwo",
path: "marketing/page_sections/pageTwo",
children: []
},
}
],
},
{
name: "webapp",
path: "webapp/"
children: [
{
name: "page",
path: "webapp/page/"
children: [
{
name: "pageone",
path: "webapp/page/pageone"
children: []
},
{
name: "pagetwo",
path: "webapp/page/pagetwo"
children: []
},
}
]
},
]
子数组的第一个索引是父级,第二个索引是父级的子级,第三个索引是第二个索引的子级(依此类推)。
解决方案
最短的方法是迭代嵌套名称并查找具有相同名称的对象。如果不存在,则创建一个新对象。children
将数组作为新级别返回。
这种方法的特点Array#reduce
是迭代外部数组data
和所有内部数组。
const
data = [["marketing", "page_sections", "PageOne"], ["marketing", "page_sections", "PageTwo"], ["webapp", "page", "pageone"], ["webapp", "page", "pagetwo"]],
result = data.reduce((r, names) => {
names.reduce((level, name, i, values) => {
let temp = level.find(q => q.name === name),
path = values.slice(0, i + 1).join('/') + (i ? '' : '/');
if (!temp) level.push(temp = { name, path, children: [] });
return temp.children;
}, r);
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- c# - 碰撞后触发定时器
- java - Gradle“实现”依赖项未使用正确的代码编译
- c# - 从 C# 中的多级集合中删除项目
- angular - 在 *ngFor 中使用 ng-class 有条件地格式化 Angular 11 中的表格单元格
- arrays - 如何在 mongoimport 中指定多个嵌套文档?
- c# - 带有 if 块 C# 的自定义系统属性
- javascript - 在 ExtJS 中使 EasyGridCombo 成为必需
- sql - 从 BQ 中刚刚过期的视图中查询
- spring-boot - JPA 不能在不删除双方的情况下删除 ManyToMany
- reactjs - 如何确定将什么状态传递给子组件