var routes = [
{
title: '首页',
key: '/app/dashboard',
icon: 'HomeOutlined',
isPublic: true,
isMenu: 1,
id: 1,
pid: 0
},
{
title: '商品',
key: '/app/products',
icon: 'ClusterOutlined',
isMenu: 1,
id: 2,
pid: 0,
children: [
{
title: '品类管理',
key: '/app/category',
icon: 'GoldOutlined',
isMenu: 1,
id: 3,
pid: 2
},
{
title: '商品管理',
key: '/app/product',
icon: 'AppstoreOutlined',
isMenu: 1,
id: 4,
pid: 2
}
]
},
{
title: '图形图表',
key: '/app/charts',
icon: 'AreaChartOutlined',
isMenu: 1,
id: 7,
pid: 0,
children: [
{
title: '柱形图',
key: '/app/charts/bar',
icon: 'BarChartOutlined',
isMenu: 1,
id: 8,
pid: 7
},
{
title: '折线图',
key: '/app/charts/line',
icon: 'LineChartOutlined',
isMenu: 1,
id: 9,
pid: 7
},
{
title: '饼图',
key: '/app/charts/pie',
icon: 'PieChartOutlined',
isMenu: 1,
id: 10,
pid: 7
}
]
},
{
title: '状态管理',
key: '/app/store',
icon: 'ApartmentOutlined',
isMenu: 1,
id: 11,
pid: 0
}
];
上面是数据,我有一个pathname
为/app/charts/pie
,改方法需要返回:
let result = {
title: '图形图表',
key: '/app/charts',
icon: 'AreaChartOutlined',
isMenu: 1,
id: 7,
pid: 0,
children: [
{
title: '折线图',
key: '/app/charts/line',
icon: 'LineChartOutlined',
isMenu: 1,
id: 9,
pid: 7
}
]
}
求该方法
/**
* 获取指定元素的所有父级对象的索引
* @param {array} treeData - 要匹配的树
* @param {string} $selectKey - 要匹配的元素
* github: https://github.com/chenyin151/GetParentForTree
*/
export const getParentForTree = (treeData, $selectKey) => {
for (let i = 0; i < treeData.length; i++) {
const layer = 0;
const posIndx = [];
const item = treeData[i];
if (item.key === $selectKey) {
return [{ key: item.key, title: item.title }];
} else {
const res = scanTree(item, $selectKey, layer, posIndx);
if (res) return res;
}
}
};
/**
* 扫描树下面的孩子对象
* @param {object} $item - 要递归遍历的对象
* @param {string} $key - 要匹配的元素
* @param {number} $layer - 遍历到哪一级孩子对象
* @param {array} $posIndx - 用来存储匹配到的元素的所有父级
* @returns {array} - 匹配到的元素的所有父级
*/
const scanTree = ($item, $key, $layer, $posIndx) => {
// console.log('layer', $item, $key, $layer, $posIndx);
if (!$item.children) {
$layer -= 1;
return false;
}
$posIndx[$layer] = { key: $item.key, title: $item.title };
for (let i = 0; i < $item.children.length; i++) {
const item = $item.children[i];
if (item.key === $key) {
// console.log('找到节点,节点位置是:', i);
$posIndx.push({ key: item.key, title: item.title });
return $posIndx;
} else {
// console.log('深入到子节点');
const layer = $layer + 1;
const node = scanTree(item, $key, layer, $posIndx);
if (!node && $posIndx.length > 0) {
$posIndx.length -= 1;
$posIndx[$layer] = { key: $item.key, title: $item.title };
}
if (node) return node;
}
}
};
这个你不是都知道 地址是/app/charts/pie了么,那找到key ='/app/charts/pie'的值,然后这个值有对应的pid,再根据pid找父级不就出来了吗?