【发布时间】:2021-10-23 11:35:44
【问题描述】:
给定一棵树:
type DataType = {
id: string;
access: 'view' | 'none';
isDisabled: boolean;
children: DataType[];
};
const Data: DataType = {
id: '1',
access: 'view',
isDisabled: false,
children: [
{
id: '2',
access: 'view',
isDisabled: false,
children: [
{
id: '3',
access: 'view',
isDisabled: false,
children: [],
},
{
id: '4',
access: 'view',
isDisabled: false,
children: [],
},
],
},
{
id: '5',
access: 'view',
isDisabled: false,
children: [],
},
],
};
我想做的是当一个节点的访问权限发生变化时,isDisabled布尔值会根据以下规则发生变化:
如果访问是“查看”,则 isDisabled 将保持为 false 如果 access 为 'none',则当前节点的 isDisabled 为 false,但其子节点的 isDisabled 为 true。
这就是我现在拥有的:
export const find = (data, selectedId, access) => {
if (!selectedId || !access) {
return data;
}
if (data.id === selectedId) {
data = changeAccess(data, selectedId, access);
return data;
}
data.children.map((child) => find(child, selectedId, access));
return data; // this is where the problem lies, but not sure how to fix it
};
export const changeAccess = (data, selectedId, access) => ({
...data,
access: access,
isDisabled: data.id !== selectedId && access !== 'view' ? true : false, // this toggles isDisabled
children: data.children?.map((child) =>
changeAccess(child, selectedId, access)
),
});
所以当我调用“查找”时
const result = find(Data, '2', 'none');
结果应该等于以下:
const DataAfter: DataType = {
id: '1',
access: 'view',
isDisabled: false,
children: [
{
id: '2',
access: 'none',
isDisabled: false,
children: [
{
id: '3',
access: 'none',
isDisabled: true,
children: [],
},
{
id: '4',
access: 'none',
isDisabled: true,
children: [],
},
],
},
{
id: '5',
access: 'view',
isDisabled: false,
children: [],
},
],
};
【问题讨论】:
-
什么是
.dataId? -
抱歉,打错了,改了:)
标签: javascript typescript recursion tree treeview