forked from github/fast-deep-copy
init
This commit is contained in:
commit
036a7c8470
47
dist/deep-copy.js
vendored
Normal file
47
dist/deep-copy.js
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/** from https://github.com/vuejs/vuex/blob/dev/src/util.js
|
||||
* Get the first item that pass the test
|
||||
* by second argument function
|
||||
*
|
||||
* @param {Array} list
|
||||
* @param {Function} f
|
||||
* @return {*}
|
||||
*/
|
||||
function find(list, f) {
|
||||
return list.filter(f)[0];
|
||||
}
|
||||
/**
|
||||
* Deep copy the given object considering circular structure.
|
||||
* This function caches all nested objects and its copies.
|
||||
* If it detects circular structure, use cached copy to avoid infinite loop.
|
||||
*
|
||||
* @param {*} obj
|
||||
* @param {Array<Object>} cache
|
||||
* @return {*}
|
||||
*/
|
||||
function deepCopy(obj, cache) {
|
||||
if (cache === void 0) { cache = []; }
|
||||
// just return if obj is immutable value
|
||||
if (obj === null || typeof obj !== 'object') {
|
||||
return obj;
|
||||
}
|
||||
// if obj is hit, it is in circular structure
|
||||
var hit = find(cache, function (c) { return c.original === obj; });
|
||||
if (hit) {
|
||||
return hit.copy;
|
||||
}
|
||||
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
|
||||
});
|
||||
Object.keys(obj).forEach(function (key) {
|
||||
copy[key] = deepCopy(obj[key], cache);
|
||||
});
|
||||
return copy;
|
||||
}
|
||||
exports.deepCopy = deepCopy;
|
||||
//# sourceMappingURL=deep-copy.js.map
|
1
dist/deep-copy.js.map
vendored
Normal file
1
dist/deep-copy.js.map
vendored
Normal file
@ -0,0 +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"}
|
11
package.json
Normal file
11
package.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "fast-deep-copy",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC"
|
||||
}
|
3
readme.md
Normal file
3
readme.md
Normal file
@ -0,0 +1,3 @@
|
||||
```js
|
||||
import { deepCopy } from 'fast-deep-copy'
|
||||
```
|
47
src/deep-copy.ts
Normal file
47
src/deep-copy.ts
Normal file
@ -0,0 +1,47 @@
|
||||
/** from https://github.com/vuejs/vuex/blob/dev/src/util.js
|
||||
* Get the first item that pass the test
|
||||
* by second argument function
|
||||
*
|
||||
* @param {Array} list
|
||||
* @param {Function} f
|
||||
* @return {*}
|
||||
*/
|
||||
function find(list, f) {
|
||||
return list.filter(f)[0]
|
||||
}
|
||||
|
||||
/**
|
||||
* Deep copy the given object considering circular structure.
|
||||
* This function caches all nested objects and its copies.
|
||||
* If it detects circular structure, use cached copy to avoid infinite loop.
|
||||
*
|
||||
* @param {*} obj
|
||||
* @param {Array<Object>} cache
|
||||
* @return {*}
|
||||
*/
|
||||
export function deepCopy<T>(obj: T, cache = []): T {
|
||||
// just return if obj is immutable value
|
||||
if (obj === null || typeof obj !== 'object') {
|
||||
return obj
|
||||
}
|
||||
|
||||
// if obj is hit, it is in circular structure
|
||||
const hit = find(cache, c => c.original === obj)
|
||||
if (hit) {
|
||||
return hit.copy
|
||||
}
|
||||
|
||||
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
|
||||
})
|
||||
|
||||
Object.keys(obj).forEach(key => {
|
||||
copy[key] = deepCopy(obj[key], cache)
|
||||
})
|
||||
|
||||
return <T>copy;
|
||||
}
|
14
tsconfig.json
Normal file
14
tsconfig.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"compileOnSave": true,
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es5",
|
||||
"sourceMap": true,
|
||||
"allowJs":true,
|
||||
"moduleResolution": "node",
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": [
|
||||
"src/**/*"
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue
Block a user