基于数组中位置的动态菜单
Dynamic menu based on locations from array of arrays
我正在尝试根据数组数组中提供的位置生成动态菜单。
我要实现的目标:
菜单结构如下:
Location 1
|_ sub-location 1
|_ sub-location 2
|_ floor 1
|_ floor 2
Location 2
|_ sub-location 1
等等。菜单必须是动态的,因为我事先不知道哪些位置会出现。
位置以数组的形式提供。数组中的每个数组都包含一个位置的完整路径,例如
[
["Location 1"],
["Location 1", "sub-location 1"],
["Location 1", "sub-location 2", "floor 1"]
["Location 1", "sub-location 2", "floor 2"]
]
很多情况下,会出现重复。
我正在尝试想出一些巧妙的方法来将其压缩为某种使用 React 呈现它的方式。我正在使用 Antd 的菜单组件。
我正在努力获取适合模型的数组,因为我不知道如何以允许任意数量的子菜单和菜单项的方式构建它。
它能以某种方式制成物体或类似的东西吗?
React 和 javascript.
还是很新的
如果有人能提供一些指导,那将非常有帮助!
这种结构可能更易于理解和使用。
{
name: 'Location 1',
sub: [
{
name: 'sub-location 1',
sub: [
{ name: 'floor 1' },
{ name: 'floor 2' },
]
}
]
}
让我们将上述结构称为单个 menuItem
。现在你可以拥有一系列菜单,就像这样
const menuItems = [menuItem1, menuItem2, ....]
使用此代码转换您的数据
const badMenu = [
['Location 1'],
['Location 1', 'sub-location 1'],
['Location 1', 'sub-location 2', 'floor 1'],
['Location 1', 'sub-location 2', 'floor 2'],
['Location 2', 'sub-location 2', 'floor 2'],
['Location 2', 'sub-location 2', 'floor 2'],
];
const func = (array, menu) => {
const name = array[0];
if (!name) {
return;
}
let selected = menu.find((menuItem) => menuItem.name == name);
if (!selected) {
selected = { name, sub: [] };
menu.push(selected);
}
func(array.slice(1), selected.sub);
};
let newMenu = [];
for (let i = 0; i < badMenu.length; i++) {
const menuList = badMenu[i];
func(menuList, newMenu);
}
console.log(JSON.stringify(newMenu, null, 4));
要使用 antd
呈现此菜单:
const renderMenu = (menu, i) => {
if (menu.sub && menu.sub.length) {
return (
<Menu.SubMenu key={menu.name + i} title={menu.name}>
{menu.sub.map(renderMenu)}
</Menu.SubMenu>
);
}
return <Menu.Item key={menu.name + i}>{menu.name}</Menu.Item>;
};
function App() {
return <Menu>{menu.map(renderMenu)}</Menu>;
}
我正在尝试根据数组数组中提供的位置生成动态菜单。
我要实现的目标:
菜单结构如下:
Location 1
|_ sub-location 1
|_ sub-location 2
|_ floor 1
|_ floor 2
Location 2
|_ sub-location 1
等等。菜单必须是动态的,因为我事先不知道哪些位置会出现。
位置以数组的形式提供。数组中的每个数组都包含一个位置的完整路径,例如
[
["Location 1"],
["Location 1", "sub-location 1"],
["Location 1", "sub-location 2", "floor 1"]
["Location 1", "sub-location 2", "floor 2"]
]
很多情况下,会出现重复。
我正在尝试想出一些巧妙的方法来将其压缩为某种使用 React 呈现它的方式。我正在使用 Antd 的菜单组件。
我正在努力获取适合模型的数组,因为我不知道如何以允许任意数量的子菜单和菜单项的方式构建它。
它能以某种方式制成物体或类似的东西吗? React 和 javascript.
还是很新的如果有人能提供一些指导,那将非常有帮助!
这种结构可能更易于理解和使用。
{
name: 'Location 1',
sub: [
{
name: 'sub-location 1',
sub: [
{ name: 'floor 1' },
{ name: 'floor 2' },
]
}
]
}
让我们将上述结构称为单个 menuItem
。现在你可以拥有一系列菜单,就像这样
const menuItems = [menuItem1, menuItem2, ....]
使用此代码转换您的数据
const badMenu = [
['Location 1'],
['Location 1', 'sub-location 1'],
['Location 1', 'sub-location 2', 'floor 1'],
['Location 1', 'sub-location 2', 'floor 2'],
['Location 2', 'sub-location 2', 'floor 2'],
['Location 2', 'sub-location 2', 'floor 2'],
];
const func = (array, menu) => {
const name = array[0];
if (!name) {
return;
}
let selected = menu.find((menuItem) => menuItem.name == name);
if (!selected) {
selected = { name, sub: [] };
menu.push(selected);
}
func(array.slice(1), selected.sub);
};
let newMenu = [];
for (let i = 0; i < badMenu.length; i++) {
const menuList = badMenu[i];
func(menuList, newMenu);
}
console.log(JSON.stringify(newMenu, null, 4));
要使用 antd
呈现此菜单:
const renderMenu = (menu, i) => {
if (menu.sub && menu.sub.length) {
return (
<Menu.SubMenu key={menu.name + i} title={menu.name}>
{menu.sub.map(renderMenu)}
</Menu.SubMenu>
);
}
return <Menu.Item key={menu.name + i}>{menu.name}</Menu.Item>;
};
function App() {
return <Menu>{menu.map(renderMenu)}</Menu>;
}