diff --git a/snippets/deepClone.md b/snippets/deepClone.md index fe2af84eb..de791ee7e 100644 --- a/snippets/deepClone.md +++ b/snippets/deepClone.md @@ -7,16 +7,22 @@ Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of th Use `Object.keys()` and `Array.forEach()` to determine which key-value pairs need to be deep cloned. ```js + + const deepClone = obj => { let clone = Object.assign({}, obj); Object.keys(clone).forEach( key => (clone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]) ); - return clone; + return Array.isArray(obj) ? Array.from(clone) : clone; }; ``` ```js + + + + const a = { foo: 'bar', obj: { a: 1, b: 2 } }; const b = deepClone(a); // a !== b, a.obj !== b.obj ``` diff --git a/test/deepClone/deepClone.js b/test/deepClone/deepClone.js index dcf7720b4..62e3364ff 100644 --- a/test/deepClone/deepClone.js +++ b/test/deepClone/deepClone.js @@ -3,6 +3,6 @@ let clone = Object.assign({}, obj); Object.keys(clone).forEach( key => (clone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]) ); -return clone; +return Array.isArray(obj) ? Array.from(clone) : clone; }; -module.exports = deepClone; \ No newline at end of file +module.exports = deepClone; diff --git a/test/deepClone/deepClone.test.js b/test/deepClone/deepClone.test.js index 03c936c46..c2276f6ae 100644 --- a/test/deepClone/deepClone.test.js +++ b/test/deepClone/deepClone.test.js @@ -7,8 +7,12 @@ test('Testing deepClone', (t) => { t.true(typeof deepClone === 'function', 'deepClone is a Function'); const a = { foo: 'bar', obj: { a: 1, b: 2 } }; const b = deepClone(a); + const c = [{foo: "bar"}]; + const d = deepClone(c); t.notEqual(a, b, 'Shallow cloning works'); t.notEqual(a.obj, b.obj, 'Deep cloning works'); + t.notEqual(c, d, "Array shallow cloning works"); + t.notEqual(c[0], d[0], "Array deep cloning works"); //t.deepEqual(deepClone(args..), 'Expected'); //t.equal(deepClone(args..), 'Expected'); //t.false(deepClone(args..), 'Expected');