Skip to content

Commit

Permalink
key formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
Tim Davis committed Dec 19, 2015
1 parent c2535fd commit 89ce483
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 19 deletions.
49 changes: 43 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,59 @@
# deep-clone
Stand-alone deep cloning of Arrays and Objects
Deep cloning of Arrays and Objects

[![Build Status](https://travis-ci.org/thebearingedge/deep-clone.svg?branch=master)](https://travis-ci.org/thebearingedge/deep-clone)

```bash
$ npm install --save deep-clone
$ npm i -S deep-clone
```

deepClone(obj, [fn keyFormatter])
---

Recursively clone nested objects and arrays containing primitive data or objects and arrays containing primitive data.

```javascript
import assert from 'assert'
import deepClone from 'deep-clone'

const foo = { bar: 'baz' }
const fooClone = deepClone(foo)

assert.deepEqual(foo, fooClone) // true
assert.notEqual(foo, fooClone) // true

const arr = [{ foo: 'bar'}, { baz: 'qux'}]
const arrClone = deepClone(arr)

assert.deepEqual(arr, arrClone) // true
assert.notEqual(arr, arrClone) // true
```

Deep clone an Object or Array and format the keys.

```javascript
import assert from 'assert'
import camelCase from 'camelcase'
import deepClone from 'deep-clone'

const obj = { /* ... */ }
const cloneOfObj = deepClone(obj)
const foo = { bar_baz: 'qux' }
const fooClone = deepClone(foo, camelCase)

assert.deepEqual(fooClone, { barBaz: 'qux' }) // true
```

Or.

```javascript
import assert from 'assert'
import camelCase from 'camelcase'
import { formatKeys } from 'deep-clone'

const camelKeys = formatKeys(camelCase)
const arr = [{ foo_bar: 'baz' }, { qux_quux: 'corge' }]
const arrClone = camelKeys(arr)

const arr = [ /* ... */ ]
const cloneOfArr = deepClone(arr)
assert.deepEqual(arrClone, [{ fooBar: 'baz' }, { quxQuux: 'corge' }]) // true
```

Other options:
Expand Down
16 changes: 12 additions & 4 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,30 @@ Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = deepClone;
exports.formatKeys = formatKeys;

function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj; }

function deepClone(obj) {
function deepClone(obj, format) {
if (!obj || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object') return obj;
if (Array.isArray(obj)) {
var _clone = new Array(obj.length);
var _clone = [];
for (var i = 0; i < obj.length; i++) {
_clone[i] = deepClone(obj[i]);
_clone[i] = deepClone(obj[i], format);
}
return _clone;
}
var clone = {};
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
clone[keys[i]] = deepClone(obj[keys[i]]);
var key = format ? format(keys[i]) : keys[i];
clone[key] = deepClone(obj[keys[i]], format);
}
return clone;
}

function formatKeys(fn) {
return function (obj) {
return deepClone(obj, fn);
};
}
10 changes: 7 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"name": "deep-clone",
"version": "1.0.2",
"version": "1.1.0",
"description": "Stand-alone deep cloning of Arrays and Objects",
"main": "index.js",
"scripts": {
"test": "mocha --compilers js:babel-core/register",
"dev": "mocha -w --compilers js:babel-core/register",
"tdd": "mocha -w --compilers js:babel-core/register",
"pretransform": "npm test",
"transform": "babel src --out-dir lib",
"prepublish": "npm run transform"
Expand All @@ -14,7 +14,9 @@
"type": "git",
"url": "git+https://github.com/thebearingedge/deep-clone.git"
},
"keywords": ["clone"],
"keywords": [
"clone"
],
"author": "",
"license": "MIT",
"bugs": {
Expand All @@ -26,6 +28,8 @@
"babel-core": "^6.2.1",
"babel-preset-es2015": "^6.1.18",
"chai": "^3.4.1",
"lodash.camelcase": "3.0.1",
"lodash.snakecase": "3.0.1",
"mocha": "^2.3.4"
}
}
13 changes: 9 additions & 4 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@

export default function deepClone(obj) {
export default function deepClone(obj, format) {
if (!obj || typeof obj !== 'object') return obj
if (Array.isArray(obj)) {
const clone = new Array(obj.length)
const clone = []
for (let i = 0; i < obj.length; i++) {
clone[i] = deepClone(obj[i])
clone[i] = deepClone(obj[i], format)
}
return clone
}
const clone = {}
const keys = Object.keys(obj)
for (let i = 0; i < keys.length; i++) {
clone[keys[i]] = deepClone(obj[keys[i]])
const key = format ? format(keys[i]) : keys[i]
clone[key] = deepClone(obj[keys[i]], format)
}
return clone
}

export function formatKeys(fn) {
return obj => deepClone(obj, fn)
}
19 changes: 17 additions & 2 deletions test/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@

import { expect } from 'chai'
import deepClone from '../src/index.js'
import camelCase from 'lodash.camelcase'
import snakeCase from 'lodash.snakecase'
import deepClone, { formatKeys } from '../src/index.js'

describe('deepClone', () => {
describe('deepClone(obj)', () => {

it('clones flat objects', () => {
const obj = { foo: 'bar', baz: 'qux' }
Expand Down Expand Up @@ -66,5 +68,18 @@ describe('deepClone', () => {
expect(clone[1]).not.to.equal(arr[1])
})

it('formats keys', () => {
const obj = { foo_bar: 'baz' }
const clone = deepClone(obj, camelCase)
expect(clone).to.deep.equal({ fooBar: 'baz' })
})

it('stores a key format function', () => {
const snakeKeys = formatKeys(snakeCase)
const obj = { fooBar: 'baz' }
const clone = snakeKeys(obj)
expect(clone).to.deep.equal({ foo_bar: 'baz' })
})

})

0 comments on commit 89ce483

Please sign in to comment.