Blog>
Snippets

Dynamic Facets Based on Data

Illustrate the process of dynamically generating facet options based on the underlying data in React TanStack Table, using a filter method to illustrate practical application.
import { useMemo } from 'react';
import { useTable } from '@tanstack/react-table';
Initial import statements to use useMemo hook for memoization and useTable hook from @tanstack/react-table for table logic.
const data = [...] // Your dataset
Assuming 'data' holds the dataset where dynamic facets need to be generated based on its contents.
const columns = Object.keys(data[0]).map(key => ({
  Header: key,
  accessor: key
}));
Generate column definitions dynamically based on the keys of the first object in the dataset. This assumes all objects have the same structure.
const tableInstance = useTable({
  columns,
  data
});
Initialize the table instance using the useTable hook with the dynamically generated columns and provided data.
const renderTable = () => {
  const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    rows,
    prepareRow,
  } = tableInstance;

  // Table structure goes here
};
Define a function 'renderTable' that deconstructs required properties and methods from the table instance to construct the table's HTML structure.
const FacetFilter = ({ data, columnName, addFilter }) => {
  const options = useMemo(() => {
    const unique = new Set(data.map(item => item[columnName]));
    return [...unique];
  }, [data, columnName]);

  return (
    <select onChange={(e) => addFilter(columnName, e.target.value)}>
      {options.map(option => (
        <option key={option} value={option}>{option}</option>
      ))}
    </select>
  );
};
Component 'FacetFilter' creates a select element based on unique values of a specified column in the data. It takes the entire data, column name, and an addFilter function as props.