递归访问对象中的 key/value 对对象并将它们组合成一个平面数组
Recursively accessing key/value pairs of object within objects & combining them together into a flat array
我有一个包含我所有路线的对象数组。我需要访问所有对象的嵌套子属性及其属性并将它们组合在一起。
我的对象数组类似于:
const routes = [
{
path: '/system-settings1',
name: 'global-settings1',
component: 'tabs1',
children: [
{
path: 'level2-accounting1',
name: 'local-settings1',
components: 'modals1',
children: [
{
path: 'level3-accounting1',
name: 'local-settings1',
components: 'modals1'
}
// more children deeply nested(or not)
]
},
{
path: 'level2-accounting1',
name: 'local-settings1',
components: 'modals1',
children: [
{
path: 'level3-accounting1',
name: 'local-settings1',
components: 'modals1'
}
// more children deeply nested(or not)
]
}
],
},
{
path: '/system-settings2',
name: 'global-settings2',
component: 'tabs2',
children: [
{
path: 'level2-accounting2',
name: 'local-settings2',
components: 'modals2',
children: [
{
path: 'level3-accounting2',
name: 'local-settings2',
components: 'modals2'
}
// more children deeply nested(or not)
]
},
{
path: 'level3-accounting2',
name: 'local-settings2',
components: 'modals2',
children: [
{
path: 'level4-accounting2',
name: 'local-settings2',
components: 'modals2'
}
// more children deeply nested(or not)
],
}
],
},
// more objects with similar key/value pairs
];
我需要像这样将对象数组变成单层平面数组:
[
{
path: '/system-settings1',
name: 'global-settings1',
component: 'tabs1',
},
{
path: 'level2-accounting2',
name: 'local-settings2',
components: 'modals2',
},
{
path: 'level3-accounting1',
name: 'local-settings1',
components: 'modals1'
},
{
path: 'level2-accounting1',
name: 'local-settings1',
components: 'modals1',
}
// so on if there is more objects etc
]
我曾尝试 .map()
& .filter()
与 while
循环相结合,但老实说,我缺乏自己完成的技能,不值得包括我的尝试。如果有人能帮助我并解释一下,我将不胜感激。
我试图编辑您的代码示例,使它们有意义并且 运行 没有错误。这是一个在根 routes
数组以及任何嵌套的 children
数组上调用的递归函数:
const flatten = routes => {
const flattened = [];
for (let i = 0; i < routes.length; i++) {
const route = routes[i];
//for each route, grab only the information about the route itself (no children)
const { path, name, components } = route;
const flatRoute = { path, name, components };
//add the new route object to our return array
flattened.push(flatRoute);
//if the route had children, recursively call flatten on them
//and add each child to our return array
if (route.children) {
const flatChildren = flatten(route.children);
flattened.push(...flatChildren);
}
}
return flattened;
};
这是一个非常简单的 ES6 函数。它可能不是可用的最高性能版本,但它很简单。
const flattenAll = (xs) => xs .reduce (
(all, {children, ...rest}) => [...all, {...rest}, ...flattenAll(children || [])],
[]
)
const routes = [{path: "/system-settings1", name: "global-settings1", component: "tabs1", children: [{path: "level2-accounting1", name: "local-settings1", components: "modals1", children: [{path: "level3-accounting1", name: "local-settings1", components: "modals1"}]}, {path: "level2-accounting1", name: "local-settings1", components: "modals1", children: [{path: "level3-accounting1", name: "local-settings1", components: "modals1"}]}]}, {path: "/system-settings2", name: "global-settings2", component: "tabs2", children: [{path: "level2-accounting2", name: "local-settings2", components: "modals2", children: [{path: "level3-accounting2", name: "local-settings2", components: "modals2"}]}, {path: "level3-accounting2", name: "local-settings2", components: "modals2", children: [{path: "level4-accounting2", name: "local-settings2", components: "modals2"}]}]}];
console .log (flattenAll (routes))
请注意,这使用了深度优先排序;我猜广度优先的代码会明显更丑陋,但我还没有尝试过。
我有一个包含我所有路线的对象数组。我需要访问所有对象的嵌套子属性及其属性并将它们组合在一起。
我的对象数组类似于:
const routes = [
{
path: '/system-settings1',
name: 'global-settings1',
component: 'tabs1',
children: [
{
path: 'level2-accounting1',
name: 'local-settings1',
components: 'modals1',
children: [
{
path: 'level3-accounting1',
name: 'local-settings1',
components: 'modals1'
}
// more children deeply nested(or not)
]
},
{
path: 'level2-accounting1',
name: 'local-settings1',
components: 'modals1',
children: [
{
path: 'level3-accounting1',
name: 'local-settings1',
components: 'modals1'
}
// more children deeply nested(or not)
]
}
],
},
{
path: '/system-settings2',
name: 'global-settings2',
component: 'tabs2',
children: [
{
path: 'level2-accounting2',
name: 'local-settings2',
components: 'modals2',
children: [
{
path: 'level3-accounting2',
name: 'local-settings2',
components: 'modals2'
}
// more children deeply nested(or not)
]
},
{
path: 'level3-accounting2',
name: 'local-settings2',
components: 'modals2',
children: [
{
path: 'level4-accounting2',
name: 'local-settings2',
components: 'modals2'
}
// more children deeply nested(or not)
],
}
],
},
// more objects with similar key/value pairs
];
我需要像这样将对象数组变成单层平面数组:
[
{
path: '/system-settings1',
name: 'global-settings1',
component: 'tabs1',
},
{
path: 'level2-accounting2',
name: 'local-settings2',
components: 'modals2',
},
{
path: 'level3-accounting1',
name: 'local-settings1',
components: 'modals1'
},
{
path: 'level2-accounting1',
name: 'local-settings1',
components: 'modals1',
}
// so on if there is more objects etc
]
我曾尝试 .map()
& .filter()
与 while
循环相结合,但老实说,我缺乏自己完成的技能,不值得包括我的尝试。如果有人能帮助我并解释一下,我将不胜感激。
我试图编辑您的代码示例,使它们有意义并且 运行 没有错误。这是一个在根 routes
数组以及任何嵌套的 children
数组上调用的递归函数:
const flatten = routes => {
const flattened = [];
for (let i = 0; i < routes.length; i++) {
const route = routes[i];
//for each route, grab only the information about the route itself (no children)
const { path, name, components } = route;
const flatRoute = { path, name, components };
//add the new route object to our return array
flattened.push(flatRoute);
//if the route had children, recursively call flatten on them
//and add each child to our return array
if (route.children) {
const flatChildren = flatten(route.children);
flattened.push(...flatChildren);
}
}
return flattened;
};
这是一个非常简单的 ES6 函数。它可能不是可用的最高性能版本,但它很简单。
const flattenAll = (xs) => xs .reduce (
(all, {children, ...rest}) => [...all, {...rest}, ...flattenAll(children || [])],
[]
)
const routes = [{path: "/system-settings1", name: "global-settings1", component: "tabs1", children: [{path: "level2-accounting1", name: "local-settings1", components: "modals1", children: [{path: "level3-accounting1", name: "local-settings1", components: "modals1"}]}, {path: "level2-accounting1", name: "local-settings1", components: "modals1", children: [{path: "level3-accounting1", name: "local-settings1", components: "modals1"}]}]}, {path: "/system-settings2", name: "global-settings2", component: "tabs2", children: [{path: "level2-accounting2", name: "local-settings2", components: "modals2", children: [{path: "level3-accounting2", name: "local-settings2", components: "modals2"}]}, {path: "level3-accounting2", name: "local-settings2", components: "modals2", children: [{path: "level4-accounting2", name: "local-settings2", components: "modals2"}]}]}];
console .log (flattenAll (routes))
请注意,这使用了深度优先排序;我猜广度优先的代码会明显更丑陋,但我还没有尝试过。