From 25e19bbf04f5b0fea69f9e441de6abc5d0b7e59d Mon Sep 17 00:00:00 2001 From: zlh <625335512@qq.com> Date: Sat, 23 Sep 2017 15:26:41 +0800 Subject: [PATCH] add test --- dist/deep-copy.js | 5 +---- dist/deep-copy.js.map | 2 +- dist/test.js | 12 ++++++++++++ dist/test.js.map | 1 + package.json | 20 +++++++++++++++----- src/deep-copy.ts | 19 ++++++++----------- src/test.ts | 11 +++++++++++ 7 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 dist/test.js create mode 100644 dist/test.js.map create mode 100644 src/test.ts diff --git a/dist/deep-copy.js b/dist/deep-copy.js index 48464aa..d770708 100644 --- a/dist/deep-copy.js +++ b/dist/deep-copy.js @@ -34,10 +34,7 @@ function deepCopy(obj, cache) { var copy = Array.isArray(obj) ? [] : {}; // put the copy into cache at first // because we want to refer it in recursive deepCopy - cache.push({ - original: obj, - copy: copy - }); + cache.push({ original: obj, copy: copy }); Object.keys(obj).forEach(function (key) { copy[key] = deepCopy(obj[key], cache); }); diff --git a/dist/deep-copy.js.map b/dist/deep-copy.js.map index 419fb82..92e5367 100644 --- a/dist/deep-copy.js.map +++ b/dist/deep-copy.js.map @@ -1 +1 @@ -{"version":3,"file":"deep-copy.js","sourceRoot":"","sources":["../src/deep-copy.ts"],"names":[],"mappings":";;AAAA;;;;;;;GAOG;AACH,cAAc,IAAI,EAAE,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,kBAA4B,GAAM,EAAE,KAAU;IAAV,sBAAA,EAAA,UAAU;IAC1C,wCAAwC;IACxC,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAA;IACd,CAAC;IAED,6CAA6C;IAC7C,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,QAAQ,KAAK,GAAG,EAAlB,CAAkB,CAAC,CAAA;IAChD,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,IAAI,CAAA;IACnB,CAAC;IAED,IAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;IACzC,mCAAmC;IACnC,oDAAoD;IACpD,KAAK,CAAC,IAAI,CAAC;QACP,QAAQ,EAAE,GAAG;QACb,IAAI,MAAA;KACP,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAA,GAAG;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,MAAM,CAAI,IAAI,CAAC;AACnB,CAAC;AAzBD,4BAyBC"} \ No newline at end of file +{"version":3,"file":"deep-copy.js","sourceRoot":"","sources":["../src/deep-copy.ts"],"names":[],"mappings":";;AAAA;;;;;;;GAOG;AACH,cAAc,IAAI,EAAE,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,kBAA4B,GAAM,EAAE,KAAU;IAAV,sBAAA,EAAA,UAAU;IAC1C,wCAAwC;IACxC,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC;IACf,CAAC;IAED,6CAA6C;IAC7C,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,QAAQ,KAAK,GAAG,EAAlB,CAAkB,CAAC,CAAC;IACjD,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,IAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC1C,mCAAmC;IACnC,oDAAoD;IACpD,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;IAEpC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAA,GAAG;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAI,IAAI,CAAC;AACnB,CAAC;AAtBD,4BAsBC"} \ No newline at end of file diff --git a/dist/test.js b/dist/test.js new file mode 100644 index 0000000..7723e34 --- /dev/null +++ b/dist/test.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var deep_copy_1 = require("./deep-copy"); +var a = { dataA: 10, b: null }; +var b = { dataB: 20, a: null }; +a.b = b; +b.a = a; +var newA = deep_copy_1.deepCopy(a); +console.log(newA.dataA === 10); //true +console.log(newA.b.dataB === 20); //true +console.log(newA.b.a === newA); //true +//# sourceMappingURL=test.js.map \ No newline at end of file diff --git a/dist/test.js.map b/dist/test.js.map new file mode 100644 index 0000000..2437fbb --- /dev/null +++ b/dist/test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;AAAA,yCAAuC;AAEvC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC/B,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACR,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAER,IAAI,IAAI,GAAG,oBAAQ,CAAC,CAAC,CAAC,CAAC;AACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAK,MAAM;AAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAG,MAAM;AAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAK,MAAM"} \ No newline at end of file diff --git a/package.json b/package.json index 802b374..fee89d2 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,21 @@ { "name": "fast-deep-copy", "version": "1.0.0", - "description": "", - "main": "index.js", + "description": "20 lines code! Deep copy the given object considering circular structure", + "main": "dist/deep-copy.js", + "keywords": [ + "fast-deep-copy", + "deep-copy", + "deepcopy" + ], "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "node dist/test.js" + }, + "author": "625335512@qq.com", + "homepage": "https://github.com/zhaolihang/fast-deep-copy", + "repository": { + "type": "git", + "url": "git+https://github.com/zhaolihang/fast-deep-copy.git" }, - "author": "", "license": "ISC" -} +} \ No newline at end of file diff --git a/src/deep-copy.ts b/src/deep-copy.ts index 05efc9f..7dd81f3 100644 --- a/src/deep-copy.ts +++ b/src/deep-copy.ts @@ -7,7 +7,7 @@ * @return {*} */ function find(list, f) { - return list.filter(f)[0] + return list.filter(f)[0]; } /** @@ -22,26 +22,23 @@ function find(list, f) { export function deepCopy(obj: T, cache = []): T { // just return if obj is immutable value if (obj === null || typeof obj !== 'object') { - return obj + return obj; } // if obj is hit, it is in circular structure - const hit = find(cache, c => c.original === obj) + const hit = find(cache, c => c.original === obj); if (hit) { - return hit.copy + return hit.copy; } - const copy = Array.isArray(obj) ? [] : {} + const copy = Array.isArray(obj) ? [] : {}; // put the copy into cache at first // because we want to refer it in recursive deepCopy - cache.push({ - original: obj, - copy - }) + cache.push({ original: obj, copy }); Object.keys(obj).forEach(key => { - copy[key] = deepCopy(obj[key], cache) - }) + copy[key] = deepCopy(obj[key], cache); + }); return copy; } \ No newline at end of file diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..f59dd82 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,11 @@ +import { deepCopy } from "./deep-copy"; + +let a = { dataA: 10, b: null }; +let b = { dataB: 20, a: null }; +a.b = b; +b.a = a; + +let newA = deepCopy(a); +console.log(newA.dataA === 10); //true +console.log(newA.b.dataB === 20); //true +console.log(newA.b.a === newA); //true \ No newline at end of file