js递归删除掉多层树状数据中disabled为 true的对象

要递归删除多层树状数据中所有 disabled 属性为 true 的对象,你可以使用深度优先搜索算法遍历整个树形结构,并在遍历过程中删除满足条件的对象。

function removeDisabledObjects(data) {
  if (!data || typeof data !== 'object') {
    return data;
  }

  if (Array.isArray(data)) {
    return data.map(item => removeDisabledObjects(item)).filter(Boolean);
  }

  const { disabled, children, ...rest } = data;

  if (disabled !== true) {
    return {
      ...rest,
      ...(children && children.length > 0 && { children: removeDisabledObjects(children) })
    };
  }

  return null;
}

// 使用示例
const data = {
  id: 1,
  disabled: false,
  children: [
    {
      id: 2,
      disabled: true,
      children: [
        {
          id: 3,
          disabled: false,
          children: []
        }
      ]
    },
    {
      id: 4,
      disabled: false,
      children: []
    },
    {
      id: 5,
      disabled: true,
      children: [
        {
          id: 6,
          disabled: false,
          children: []
        }
      ]
    }
  ]
};

const filteredData = removeDisabledObjects(data);
console.log(filteredData);

在上面的代码中,removeDisabledObjects 函数使用深度优先搜索算法递归遍历树状结构。它接收一个数据对象 data 作为参数。

在遍历过程中,函数首先检查当前节点 data 是否为数组,如果是数组,则使用 map 方法遍历数组中的每个元素,并对每个元素调用递归函数 removeDisabledObjects 进行处理。然后使用 filter 方法过滤掉返回值为 null 或 undefined 的元素。

如果当前节点 data 不是数组,函数会将其解构为 { disabled, children, …rest },其中 disabled 和 children 是从 data 中提取出来的属性,而 rest 是除了 disabled 和 children 之外的其他属性。

然后,函数会检查 disabled 是否为 true。如果 disabled 不为 true,则创建一个新对象,包含 rest 的属性,以及递归调用 removeDisabledObjects 处理后的 children。如果 disabled 为 true,则返回 null,表示删除该节点。

最后,函数返回经过处理后的数据对象。

你可能感兴趣的:(js,javascript,开发语言,ecmascript)