mirror of
https://github.com/zhaolihang/fast-deep-copy.git
synced 2025-02-23 01:19:37 +08:00
add test
This commit is contained in:
parent
036a7c8470
commit
25e19bbf04
5
dist/deep-copy.js
vendored
5
dist/deep-copy.js
vendored
@ -34,10 +34,7 @@ function deepCopy(obj, cache) {
|
|||||||
var copy = Array.isArray(obj) ? [] : {};
|
var copy = Array.isArray(obj) ? [] : {};
|
||||||
// put the copy into cache at first
|
// put the copy into cache at first
|
||||||
// because we want to refer it in recursive deepCopy
|
// because we want to refer it in recursive deepCopy
|
||||||
cache.push({
|
cache.push({ original: obj, copy: copy });
|
||||||
original: obj,
|
|
||||||
copy: copy
|
|
||||||
});
|
|
||||||
Object.keys(obj).forEach(function (key) {
|
Object.keys(obj).forEach(function (key) {
|
||||||
copy[key] = deepCopy(obj[key], cache);
|
copy[key] = deepCopy(obj[key], cache);
|
||||||
});
|
});
|
||||||
|
2
dist/deep-copy.js.map
vendored
2
dist/deep-copy.js.map
vendored
@ -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"}
|
{"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"}
|
12
dist/test.js
vendored
Normal file
12
dist/test.js
vendored
Normal file
@ -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
|
1
dist/test.js.map
vendored
Normal file
1
dist/test.js.map
vendored
Normal file
@ -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"}
|
20
package.json
20
package.json
@ -1,11 +1,21 @@
|
|||||||
{
|
{
|
||||||
"name": "fast-deep-copy",
|
"name": "fast-deep-copy",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "20 lines code! Deep copy the given object considering circular structure",
|
||||||
"main": "index.js",
|
"main": "dist/deep-copy.js",
|
||||||
|
"keywords": [
|
||||||
|
"fast-deep-copy",
|
||||||
|
"deep-copy",
|
||||||
|
"deepcopy"
|
||||||
|
],
|
||||||
"scripts": {
|
"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"
|
"license": "ISC"
|
||||||
}
|
}
|
@ -7,7 +7,7 @@
|
|||||||
* @return {*}
|
* @return {*}
|
||||||
*/
|
*/
|
||||||
function find(list, f) {
|
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<T>(obj: T, cache = []): T {
|
export function deepCopy<T>(obj: T, cache = []): T {
|
||||||
// just return if obj is immutable value
|
// just return if obj is immutable value
|
||||||
if (obj === null || typeof obj !== 'object') {
|
if (obj === null || typeof obj !== 'object') {
|
||||||
return obj
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if obj is hit, it is in circular structure
|
// 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) {
|
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
|
// put the copy into cache at first
|
||||||
// because we want to refer it in recursive deepCopy
|
// because we want to refer it in recursive deepCopy
|
||||||
cache.push({
|
cache.push({ original: obj, copy });
|
||||||
original: obj,
|
|
||||||
copy
|
|
||||||
})
|
|
||||||
|
|
||||||
Object.keys(obj).forEach(key => {
|
Object.keys(obj).forEach(key => {
|
||||||
copy[key] = deepCopy(obj[key], cache)
|
copy[key] = deepCopy(obj[key], cache);
|
||||||
})
|
});
|
||||||
|
|
||||||
return <T>copy;
|
return <T>copy;
|
||||||
}
|
}
|
11
src/test.ts
Normal file
11
src/test.ts
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user