很多场景都需要使用树形数据,比如:一级菜单 - 二级菜单、省-市-区、公司-部门-小组、界-门-纲-目-科-属-种 等等。
数据结构通常如下所示(以下代码为ts写法):
const groupList: Group[] = [
{
groupId: '0',
groupName: '江西省',
isDefaultGroup: '0',
children: [
{
groupId: '0-0',
groupName: '赣州市',
isDefaultGroup: '0',
children: [
{
groupId: '0-0-0',
groupName: '瑞金市',
isDefaultGroup: '0',
},
],
},
],
},
{
groupId: '1',
groupName: '浙江省',
isDefaultGroup: '1',
children: [
{
groupId: '1-0',
groupName: '杭州市',
isDefaultGroup: '0',
children: [
{
groupId: '1-0-0',
groupName: '西湖区',
isDefaultGroup: '0',
},
],
},
],
},
{
groupId: '2',
groupName: '江苏省',
isDefaultGroup: '0',
children: [
{
groupId: '2-0',
groupName: '南京市',
isDefaultGroup: '0',
children: [
{
groupId: '2-0-0',
groupName: '中华门',
isDefaultGroup: '0',
},
],
},
],
},
];
已知
groupId
为1-0-0
如何找到它对应的名字:西湖区
呢???
groupId
为1-0-0
的对象。// 以下代码有ts报错,知道怎么解决的请告诉我
const findFieldValue = <T>(treeData: T[], key: string, value: string | number, field: string): string | number | boolean | null => {
let res: string | number | null = null;
const fn = (treeData: T[], key: string, value: string | number, field: K) => {
if (!treeData?.length) return key;
for (let index = 0; index < treeData.length; index++) {
if (treeData[index][key] === value) {
res = treeData[index][field];
break;
}
if (treeData[index]?.children?.length) {
fn(treeData[index].children, key, value, field);
}
}
};
fn(treeData, key, value, field);
return res;
}
cosole.log(findFieldValue(treeData, 'groupId', '1-0-0', 'title')) // 西湖区