perf: update deepCopy (#4364)
* perf: update deepCopy * fix: using deepCopy in core and cli packages * fix: using deepCopy in editor * chore: formatting * fix: some micro optimisation in deepCopy
This commit is contained in:
@@ -16,3 +16,4 @@ export * from './WorkflowDataProxy';
|
||||
export * from './WorkflowErrors';
|
||||
export * from './WorkflowHooks';
|
||||
export { LoggerProxy, NodeHelpers, ObservableObject, TelemetryHelpers };
|
||||
export { deepCopy } from './utils';
|
||||
|
||||
34
packages/workflow/src/utils.test.ts
Normal file
34
packages/workflow/src/utils.test.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { deepCopy } from './utils';
|
||||
|
||||
describe('deepCopy', () => {
|
||||
it('should deep copy an object', () => {
|
||||
const object = {
|
||||
deep: {
|
||||
props: {
|
||||
list: [{ a: 1 }, { b: 2 }, { c: 3 }],
|
||||
},
|
||||
arr: [1, 2, 3],
|
||||
},
|
||||
arr: [
|
||||
{
|
||||
prop: {
|
||||
list: ['a', 'b', 'c'],
|
||||
},
|
||||
},
|
||||
],
|
||||
func: () => {},
|
||||
date: new Date(),
|
||||
undef: undefined,
|
||||
nil: null,
|
||||
bool: true,
|
||||
num: 1,
|
||||
};
|
||||
const copy = deepCopy(object);
|
||||
expect(copy).toEqual(object);
|
||||
expect(copy).not.toBe(object);
|
||||
expect(copy.arr).toEqual(object.arr);
|
||||
expect(copy.arr).not.toBe(object.arr);
|
||||
expect(copy.deep.props).toEqual(object.deep.props);
|
||||
expect(copy.deep.props).not.toBe(object.deep.props);
|
||||
});
|
||||
});
|
||||
@@ -1 +1,32 @@
|
||||
export const deepCopy = <T>(toCopy: T) => JSON.parse(JSON.stringify(toCopy)) as T;
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument */
|
||||
export const deepCopy = <T>(source: T): T => {
|
||||
let clone: any;
|
||||
let i: any;
|
||||
const hasOwnProp = Object.prototype.hasOwnProperty.bind(source);
|
||||
// Primitives & Null
|
||||
if (typeof source !== 'object' || source === null) {
|
||||
return source;
|
||||
}
|
||||
// Date
|
||||
if (source instanceof Date) {
|
||||
return new Date(source.getTime()) as T;
|
||||
}
|
||||
// Array
|
||||
if (Array.isArray(source)) {
|
||||
clone = [];
|
||||
const len = source.length;
|
||||
for (i = 0; i < len; i++) {
|
||||
clone[i] = deepCopy(source[i]);
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
// Object
|
||||
clone = {};
|
||||
for (i in source) {
|
||||
if (hasOwnProp(i)) {
|
||||
clone[i] = deepCopy((source as any)[i]);
|
||||
}
|
||||
}
|
||||
return clone;
|
||||
};
|
||||
// eslint-enable
|
||||
|
||||
Reference in New Issue
Block a user