https://github.com/chrisyip/node-clone-object
Clone object with circular references, property descriptors, non-enumerable properties and more.
https://github.com/chrisyip/node-clone-object
node-module nodejs
Last synced: about 1 month ago
JSON representation
Clone object with circular references, property descriptors, non-enumerable properties and more.
- Host: GitHub
- URL: https://github.com/chrisyip/node-clone-object
- Owner: chrisyip
- License: mit
- Created: 2017-03-03T04:45:09.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2017-03-15T19:31:52.000Z (about 9 years ago)
- Last Synced: 2025-05-05T19:06:30.879Z (about 1 year ago)
- Topics: node-module, nodejs
- Language: JavaScript
- Homepage:
- Size: 6.84 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# node-clone-object
[![NPM version][npm-image]][npm-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Travis CI][travis-image]][travis-url] [![codecov][codecov-image]][codecov-url]
Clone object with:
- Circular references
- Property descriptors
- Symbol properties
- Non-enumerable properties
## Install
```
npm i clone-obj
// or
yarn add clone-obj
```
Requires `node >= 6`
## Usage
```js
const clone = require('clone-obj')
const newObj = clone(obj)
```
### `undefined` or `null`
`clone-obj` will throw `TypeError: Cannot clone undefined or null` when cloning `undefined` or `null`.
### Primitive values
`clone-obj` will return primitive values directly.
```js
clone(1) === 1
clone(true) === true
clone('foo') === 'foo'
```
### Objects
#### Object created by `new` operator
`clone-obj` will use `obj.constructor` to create new object.
```js
const arr = []
clone(arr) !== arr
const foo = new Date()
const bar = clone(date)
bar !== foo
bar.getTime() === foo.getTime()
const foo = new Buffer('foo')
const bar = clone(date)
Buffer.isBuffer(bar)
bar !== foo
bar.toString() === foo.toString()
```
#### Plain object
```js
const foo = { a: 1 }
const bar = clone(foo)
bar !== foo
bar.a === foo.a
```
#### Circular references
`clone-obj` will auto link circular references with cloned objects.
```js
const foo = {}
foo.self = foo
const bar = clone(bar)
foo !== bar
foo.self !== bar.self
bar === bar.self
console.log(bar) // { self: [Circular] }
```
#### Property descriptors
`clone-obj` respects property descriptors.
```js
const foo = {
get baz () { return this._baz * 2 },
set baz (val) { this._baz = val }
}
const bar = clone(foo)
typeof bar._baz === 'undefined'
isNaN(bar.baz)
bar.baz = 2
bar._baz === 2
bar.baz === 4
```
#### Symbols properties
```js
const sym = Symbol('foo')
const foo = { [sym]: 1 }
const bar = clone(bar)
bar.hasOwnProperty(sym)
bar[sym] === foo[sym]
```
#### Non-enumerable properties
```js
const foo = {}
Object.defineProperty(foo, 'baz', {
enumerable: false,
value: 1
})
const bar = clone(foo)
const descriptor = Object.getOwnPropertyDescriptor(bar. 'baz')
descriptor.enumrable === false
Object.keys(bar).length === 0
foo.baz === bar.baz === descriptor.value
```
#### Arrays
```js
const foo = [1, {}]
const bar = clone(foo)
Array.isArray(foo)
foo !== bar
foo.length === bar.length
foo[0] === bar[0]
foo[1] !== bar[1]
const foo = { a: [1] }
const bar = clone(foo)
Array.isArray(bar.a)
foo.a !== bar.a
foo.a.length === bar.a.length
```
[npm-url]: https://npmjs.org/package/clone-obj
[npm-image]: http://img.shields.io/npm/v/clone-obj.svg?style=flat-square
[daviddm-url]: https://david-dm.org/chrisyip/node-clone-object
[daviddm-image]: http://img.shields.io/david/chrisyip/node-clone-object.svg?style=flat-square
[travis-url]: https://travis-ci.org/chrisyip/node-clone-object
[travis-image]: http://img.shields.io/travis/chrisyip/node-clone-object.svg?style=flat-square
[codecov-url]: https://codecov.io/gh/chrisyip/node-clone-object
[codecov-image]: https://img.shields.io/codecov/c/github/chrisyip/node-clone-object.svg?style=flat-square