From 0f905481bf57b196e8fcb415fe46c2113c02ecaf Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Sun, 9 Jan 2011 01:38:40 -0500 Subject: [PATCH] Added deep cloning for arrays --- lib/util.js | 25 +++++++++++++++++++++---- test/test-util-clone.js | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/lib/util.js b/lib/util.js index 8a344fd..7b9a19e 100644 --- a/lib/util.js +++ b/lib/util.js @@ -107,16 +107,33 @@ exports.defineSecureProp = getDefineSecureProp(); /** * Clones an object * - * @param {Object} data object to clone + * @param {Object} data object to clone + * @param {boolean} deep perform deep clone (defaults to shallow) * * @return {Object} cloned object */ -exports.clone = function( data ) +exports.clone = function clone( data, deep ) { + deep = !!deep; + if ( data instanceof Array ) { - // return a copy of the array - return data.slice( 0 ); + if ( !deep ) + { + // return a copy of the array + return data.slice( 0 ); + } + + // if we're performing a deep clone, we have to loop through each of the + // elements of the array and clone them + var ret = []; + for ( var i = 0, len = data.length; i < len; i++ ) + { + // clone this element + ret.push( clone( data[ i ], deep ) ); + } + + return ret; } else if ( data instanceof Object ) { diff --git a/test/test-util-clone.js b/test/test-util-clone.js index f49c090..28154e6 100644 --- a/test/test-util-clone.js +++ b/test/test-util-clone.js @@ -62,3 +62,27 @@ for ( prop in obj ) ); } + +// +// deep clone +var deep_arr = [ [ 1, 2 ], [ 3, 4 ], [ 5, [ 6, 7 ] ], { a: 1 } ], + deep_arr2 = util.clone( deep_arr, true ), + + deep_i = 0; + +// ensure that the cloned values still match +assert.deepEqual( + deep_arr2, + deep_arr, + "Deep cloned values are equal" +); + +deep_i = deep_arr.length; +while ( deep_i-- ) +{ + assert.ok( + ( deep_arr2[ i ] !== deep_arr[ i ] ), + "Deep cloned array's values are cloned" + ); +} +