From aa1d38b007a39441f09b1f686d6ed454af315218 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Sun, 9 Jan 2011 01:46:46 -0500 Subject: [PATCH] Added deep cloning for objects --- lib/util.js | 5 ++++- test/test-util-clone.js | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/util.js b/lib/util.js index 7b9a19e..6041531 100644 --- a/lib/util.js +++ b/lib/util.js @@ -145,7 +145,10 @@ exports.clone = function clone( data, deep ) { if ( hasOwn.call( data, prop ) ) { - newobj[ prop ] = data[ prop ]; + newobj[ prop ] = ( deep ) + ? clone( data[ prop ] ) + : data[ prop ] + ; } } diff --git a/test/test-util-clone.js b/test/test-util-clone.js index 28154e6..4305618 100644 --- a/test/test-util-clone.js +++ b/test/test-util-clone.js @@ -65,8 +65,11 @@ for ( prop in obj ) // // deep clone -var deep_arr = [ [ 1, 2 ], [ 3, 4 ], [ 5, [ 6, 7 ] ], { a: 1 } ], +var deep_arr = [ [ 1, 2 ], [ 3, 4 ], [ 5, [ 6, 7 ] ], { a: 1 } ], + deep_obj = { a: [ 1 ], b: [ 2 ], c: { d: 3 } }, + deep_arr2 = util.clone( deep_arr, true ), + deep_obj2 = util.clone( deep_obj, true ), deep_i = 0; @@ -77,6 +80,12 @@ assert.deepEqual( "Deep cloned values are equal" ); +assert.deepEqual( + deep_obj2, + deep_obj, + "Deep cloned values are equal" +); + deep_i = deep_arr.length; while ( deep_i-- ) { @@ -86,3 +95,11 @@ while ( deep_i-- ) ); } +for ( prop in deep_obj ) +{ + assert.ok( + ( deep_obj2[ prop ] !== deep_obj[ prop ] ), + "Deep cloned object's values are cloned (" + prop + ")" + ); +} +