【问题标题】:Recursively change a tree isDisable boolean递归更改树是禁用布尔值
【发布时间】: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


【解决方案1】:

您在代码中突出显示的部分:

  data.children.map((child) => find(child, selectedId, access));

  return data; // this is where the problem lies, but not sure how to fix it

... 没有使用.map() 返回的数组。所以data 会以其原始状态返回。

当映射的子数组有一个或多个新对象时,您应该返回一个新对象:

  const children = data.children.map((child) => find(child, selectedId, access));
  if (data.children.some((child, i) => child !== children[i])) {
    data = {
      ...data,
      children
    };
  }

  return data;

【讨论】:

  • 嗨 trincot,我应该在哪里调用 changeAccess 函数?
  • 没有变化。我没有修改您在.map() 中的回调。它调用find,而后者又调用changeAccess。我以为你们都对此感到满意,而您在问题中解决的问题就在这个地方(您用评论标记了)。
  • trincot,我也在尝试另一种方法。我已经做了上面的编辑
  • 抱歉,我不处理不断变化的问题。在这种情况下,我将删除我的答案。对不起。
  • 谢谢 trincot,这很有效 :) 如前所述,我正在尝试另一种方法,但由于某种原因它不起作用。我会把它作为另一个问题发布。我非常感谢您的帮助。
猜你喜欢
  • 2019-04-27
  • 2014-01-06
  • 2019-04-24
  • 2022-11-12
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多