# dot-prop

> Get, set, or delete a property from a nested object using a dot path

Latest version **10.2.0** (published 2026-07-21) · MIT license · 0 weekly downloads

> **Better alternative:** See documentation for alternatives (https://github.com/AikidoSec/module-replacements/blob/main/docs/dot-prop)

## Install

```sh
npm install dot-prop
pnpm add dot-prop
yarn add dot-prop
bun add dot-prop
```

## Health

**Score 70/100 (B)** — status: active.

Positive: has types; esm support; no vulnerabilities; recently updated; high maintenance score; high quality score.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 10.2.0 |
| Published | 2026-07-21 |
| First published | 2015-01-08 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM |
| Node | >=20 |
| Dependencies | 1 |
| Unpacked size | 33 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 866 |
| Author | Sindre Sorhus |
| Maintainers | sindresorhus |
| Keywords | object, prop, property, dot, path, get, set, delete, access, notation, dotty, dottie, unflatten, expand |

## Links

- npm: https://www.npmjs.com/package/dot-prop
- Repository: https://github.com/sindresorhus/dot-prop
- Homepage: https://github.com/sindresorhus/dot-prop#readme
- Issues: https://github.com/sindresorhus/dot-prop/issues
- Funding: https://github.com/sponsors/sindresorhus
- npm.io page: https://npm.io/package/dot-prop

## Dependencies (1)

- [type-fest](https://npm.io/package/type-fest.md) ^5.0.0

## Alternatives

- [base64url](https://npm.io/package/base64url.md) — 6.1M weekly downloads
- [get-installed-path](https://npm.io/package/get-installed-path.md) — 502.9K weekly downloads
- [@uppy/url](https://npm.io/package/@uppy/url.md) — 185.8K weekly downloads
- [@d3fc/d3fc-shape](https://npm.io/package/@d3fc/d3fc-shape.md) — 16.2K weekly downloads
- [localizer](https://npm.io/package/localizer.md) — 226 weekly downloads

## Recent versions

- 10.2.0 (latest) — 2026-07-21
- 4.2.1 (legacy) — 2020-08-16
- 10.1.0 — 2025-10-05
- 10.0.0 — 2025-09-13
- 9.0.0 — 2024-05-09
- 8.0.2 — 2023-07-18
- 8.0.1 — 2023-06-29
- 8.0.0 — 2023-04-22
- 7.2.0 — 2022-02-17
- 7.1.1 — 2022-01-22
- 7.1.0 — 2022-01-22
- 7.0.0 — 2022-01-21
- 6.0.1 — 2020-11-19
- 6.0.0 — 2020-10-07
- 5.3.0 — 2020-09-06
- … 17 more at https://npm.io/package/dot-prop/versions

## README

# dot-prop

> Get, set, or delete a property from a nested object using a dot path

## Install

```sh
npm install dot-prop
```

## Usage

```js
import {getProperty, setProperty, hasProperty, deleteProperty} from 'dot-prop';

// Getter
getProperty({foo: {bar: 'unicorn'}}, 'foo.bar');
//=> 'unicorn'

getProperty({foo: {bar: 'a'}}, 'foo.notDefined.deep');
//=> undefined

getProperty({foo: {bar: 'a'}}, 'foo.notDefined.deep', 'default value');
//=> 'default value'

getProperty({foo: {'dot.dot': 'unicorn'}}, 'foo.dot\\.dot');
//=> 'unicorn'

getProperty({foo: [{bar: 'unicorn'}]}, 'foo[0].bar');
//=> 'unicorn'

getProperty({foo: [{bar: 'unicorn'}]}, 'foo.0.bar');
//=> 'unicorn'

// Setter
const object = {foo: {bar: 'a'}};
setProperty(object, 'foo.bar', 'b');
console.log(object);
//=> {foo: {bar: 'b'}}

const foo = setProperty({}, 'foo.bar', 'c');
console.log(foo);
//=> {foo: {bar: 'c'}}

setProperty(object, 'foo.baz', 'x');
console.log(object);
//=> {foo: {bar: 'b', baz: 'x'}}

setProperty(object, 'foo.biz[0]', 'a');
console.log(object);
//=> {foo: {bar: 'b', baz: 'x', biz: ['a']}}

setProperty(object, 'foo.items.0', 'first');
console.log(object);
//=> {foo: {bar: 'b', baz: 'x', biz: ['a'], items: ['first']}}

// Has
hasProperty({foo: {bar: 'unicorn'}}, 'foo.bar');
//=> true

// Deleter
const object = {foo: {bar: 'a'}};
deleteProperty(object, 'foo.bar');
console.log(object);
//=> {foo: {}}

object.foo.bar = {x: 'y', y: 'x'};
deleteProperty(object, 'foo.bar.x');
console.log(object);
//=> {foo: {bar: {y: 'x'}}}
```

### Array paths

For improved performance and interoperability with other libraries, you can also pass paths as arrays instead of strings. This avoids the overhead of parsing string paths.

```js
import {getProperty, setProperty} from 'dot-prop';

const object = {
	users: [
		{name: 'Alice', role: 'admin'},
		{name: 'Bob', role: 'user'}
	]
};

// Using array paths - no parsing overhead
getProperty(object, ['users', 0, 'name']);
//=> 'Alice'

setProperty(object, ['users', 1, 'role'], 'moderator');
console.log(object.users[1].role);
//=> 'moderator'

// Useful for interoperability with libraries that return paths as arrays
const pathFromOtherLib = ['users', 0, 'profile', 'settings'];
setProperty(object, pathFromOtherLib, {theme: 'dark'});
```

Array paths:
- Avoid the parse/stringify cycle when you already have path segments
- Work with all functions: `getProperty`, `setProperty`, `hasProperty`, `deleteProperty`
- Numeric strings are automatically normalized to numbers for simplicity

## API

### getProperty(object, path, defaultValue?)

Get the value of the property at the given path.

Returns the value if any.

### setProperty(object, path, value)

Set the property at the given path to the given value.

Returns the object.

### hasProperty(object, path)

Check whether the property at the given path exists.

Returns a boolean.

### deleteProperty(object, path)

Delete the property at the given path.

Returns a boolean of whether the property existed before being deleted.

### escapePath(path)

Escape special characters in a path. Useful for sanitizing user input.

```js
import {getProperty, escapePath} from 'dot-prop';

const object = {
	foo: {
		bar: '👸🏻 You found me Mario!',
	},
	'foo.bar' : '🍄 The princess is in another castle!',
};
const escapedPath = escapePath('foo.bar');

console.log(getProperty(object, escapedPath));
//=> '🍄 The princess is in another castle!'
```

### parsePath(path)

Parse a dot path into an array of path segments.

Returns an array of path segments where numbers represent array indices and strings represent object keys.

```js
import {parsePath} from 'dot-prop';

parsePath('foo.bar');
//=> ['foo', 'bar']

parsePath('foo[0].bar');
//=> ['foo', 0, 'bar']

parsePath('foo.0.bar');
//=> ['foo', 0, 'bar']

parsePath('foo\\.bar');
//=> ['foo.bar']

// Use case: Iterate over path segments to build up a nested object
const path = 'users[0].profile.settings.theme';
const segments = parsePath(path);
//=> ['users', 0, 'profile', 'settings', 'theme']
```

### stringifyPath(pathSegments, options?)

Convert an array of path segments back into a path string.

Returns a string path that can be used with other dot-prop functions.

```js
import {stringifyPath} from 'dot-prop';

stringifyPath(['foo', 'bar']);
//=> 'foo.bar'

stringifyPath(['foo', 0, 'bar']);
//=> 'foo[0].bar'

stringifyPath(['foo', '0', 'bar']);
//=> 'foo[0].bar'

// With preferDotForIndices option
stringifyPath(['foo', 0, 'bar'], {preferDotForIndices: true});
//=> 'foo.0.bar'
```

#### pathSegments

Type: `Array<string | number>`

Array of path segments where numbers represent array indices and strings represent object keys.

#### options

Type: `object`

##### preferDotForIndices

Type: `boolean`\
Default: `false`

When `true`, numeric indices will use dot notation instead of bracket notation when not the first segment.

### deepKeys(object)

Returns an array of every path. Non-empty plain objects and arrays are deeply recursed and are not themselves included.

This can be useful to help flatten an object for an API that only accepts key-value pairs or for a tagged template literal.

```js
import {getProperty, deepKeys} from 'dot-prop';

const user = {
	name: {
		first: 'Richie',
		last: 'Bendall',
	},
	activeTasks: [],
	currentProject: null
};

for (const property of deepKeys(user)) {
	console.log(`${property}: ${getProperty(user, property)}`);
	//=> name.first: Richie
	//=> name.last: Bendall
	//=> activeTasks: []
	//=> currentProject: null
}
```

Sparse arrays are supported. In general, [avoid using sparse arrays](https://github.com/sindresorhus/dot-prop/issues/109#issuecomment-1614819869).

#### object

Type: `object | array`

Object or array to get, set, or delete the `path` value.

You are allowed to pass in `undefined` as the object to the `get` and `has` functions.

#### path

Type: `string | Array<string | number>`

Path of the property in the object.

**String paths**: Use `.` to separate each nested key. Use `\\.` if you have a `.` in the key. Array indices can be accessed using bracket notation (like `'users[0].name'`) or dot notation (like `'users.0.name'`). Both syntaxes are equivalent and will create arrays when setting values. Numeric strings in dot notation (like `'users.0.name'`) are automatically coerced to numbers.

**Array paths**: Pass an array of path segments for better performance and interoperability. Numbers create arrays (like `['users', 0, 'name']`). Numeric strings are normalized to numbers for simplicity. No parsing overhead.

The following path components are invalid and result in `undefined` being returned: `__proto__`, `prototype`, `constructor`.

> [!IMPORTANT]
> Sanitizing untrusted `path` input is your responsibility. Use [`escapePath`](#escapepathpath) to treat it as a literal key.
>
> Apart from the components above, no protection against attacker-controlled paths is attempted. A path can reach anything reachable from the object, including inherited properties and built-ins. Only you know which parts of your object graph are safe to expose, so guard that where the path enters your program.

#### value

Type: `unknown`

Value to set at `path`.

#### defaultValue

Type: `unknown`

Default value.

### unflatten(object)

Convert an object with dot paths into a nested object.

Uses the same path rules and escaping as the rest of the API.

```js
import {unflatten} from 'dot-prop';

const flat = {
	'unicorn.name': 'Rainbow Dash',
	'unicorn.color': '🦄',
	'unicorn.treasures[0]': 'sparkles',
	'unicorn.treasures[1]': 'glitter',
};

unflatten(flat);
/*
{
	unicorn: {
		name: 'Rainbow Dash',
		color: '🦄',
		treasures: ['sparkles', 'glitter']
	}
}
*/
```

> [!IMPORTANT]
> Numeric keys become array indices, so nodes with numeric keys turn into arrays. The `deepKeys` → `unflatten` round-trip is therefore lossy for such objects (`{a: {0: 'x', name: 'y'}}` → `{a: ['x']}`), and untrusted input can yield arrays where you expected objects.

---
_Source: https://npm.io/package/dot-prop · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
