Added deep cloning for arrays
parent
13fae953fd
commit
0f905481bf
25
lib/util.js
25
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 )
|
||||
{
|
||||
|
|
|
@ -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"
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue