CxJS

removeTreeNodes

import { removeTreeNodes } from 'cx/data'; Copied

Recursively removes nodes from a tree structure that match the criteria. Returns a new tree without the matching nodes, or the original tree if no nodes were removed.

const filtered = removeTreeNodes(array, criteria, childrenField);
ArgumentTypeDescription
arrayT[]Tree data array to filter.
criteria(node: T) => booleanPredicate returning true for nodes to remove.
childrenFieldkeyof TName of the property containing child nodes.

Returns: A new tree with matching nodes removed, or the original array if unchanged.

Examples

Delete node by ID

removeTreeNodes(
  data,
  (node) => node.id === targetId,
  "$children"
);

Remove all leaf nodes

removeTreeNodes(
  data,
  (node) => node.$leaf === true,
  "$children"
);

Remove empty folders

removeTreeNodes(
  data,
  (node) => !node.$leaf && (!node.$children || node.$children.length === 0),
  "$children"
);

Remove with confirmation

function deleteNode(nodeId: number) {
  const node = findTreeNode(data, (n) => n.id === nodeId, "$children");

  if (!node) return;

  if (!node.$leaf && node.$children?.length > 0) {
    if (!confirm("Delete folder and all its contents?")) {
      return;
    }
  }

  store.update(m.data, (data) =>
    removeTreeNodes(data, (n) => n.id === nodeId, "$children")
  );
}

See also: updateTree, findTreeNode, Tree Operations