# Dynamic Columns

Using the `dynamic` option you can provide an array of [column definitions](https://voici.larswaechter.dev/examples/columns/broken-reference). These include the column name (`name`) and a function (`func`). The function receives the current `row` as argument which you can use to create a custom cell based on its peers. The function's return value is used as cell content.

```javascript
import { Table } from 'voici.js'

const data = [
  { firstname: 'Homer', lastname: 'Simpson', age: 39 },
  { firstname: 'Marge', lastname: 'Simpson', age: 36 },
  { firstname: 'Bart', lastname: 'Simpson', age: 10 },
  { firstname: 'Lisa', lastname: 'Simpson', age: 8 },
  { firstname: 'Maggie', lastname: 'Simpson', age: 1 }
];

const config = {
  header: {
    dynamic: {
      fullname: (row) => row['firstname'] + ' ' + row['lastname'],
      adult: (row) => row['age'] >= 18
    }
  }
};

const table = new Table(data, config);
table.printPlain();
```

Output:

```
  firstname    lastname    age    fullname          adult  
===========================================================
  Homer        Simpson     39     Homer Simpson     true   
  Marge        Simpson     36     Marge Simpson     true   
  Bart         Simpson     10     Bart Simpson      false  
  Lisa         Simpson     8      Lisa Simpson      false  
  Maggie       Simpson     1      Maggie Simpson    false  
```

### TypeScript

When using TypeScript, you have to provide the types of your dynamic columns in order to infer them. In the example from above, this would look like this:

```typescript
interface IDynamicAttributes {
    fullname: string;
    adult: boolean;
}

const table = new Table<(typeof data)[number], IDynamicAttributes)>(data, config);
```
