/lib/util/object.js

https://bitbucket.org/esatterwhite/wallace-io · JavaScript · 84 lines · 64 code · 9 blank · 11 comment · 7 complexity · 4a181437ee20bd7a534a0424272ef66d MD5 · raw file

  1. cloneArray = function( arr ){
  2. var len, clone;
  3. len = arr.length;
  4. clone = new Array(len);
  5. while(len--) {
  6. clone[len] = arr[len];
  7. }
  8. return clone;
  9. };
  10. typeOf = function(item){
  11. return ({}).toString.call(item).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
  12. };
  13. mergeOne = function( source, key, current ){
  14. switch( typeOf( current ) ){
  15. case 'object':
  16. if( typeof source[key] === 'object'){
  17. exports.merge( source[key], current);
  18. } else {
  19. source[key] = exports.clone( current );
  20. }
  21. break;
  22. case 'array':
  23. source[key] = cloneArray( current );
  24. break;
  25. default:
  26. source[ key ] = current;
  27. }
  28. return source;
  29. };
  30. cloneOf = function( item ){
  31. switch( typeOf( item ) ){
  32. case "array":
  33. return cloneArray( item );
  34. case 'object':
  35. return exports.clone( item );
  36. default:
  37. return item;
  38. }
  39. };
  40. /**
  41. * Merges multiple objects, overriding duplicate keys
  42. * @param {Object} source The primary object to merge other values into
  43. * @param {Object} obj Object to copy values from
  44. * @returns {Object} A new object with all the values from the specified objects
  45. */
  46. exports.merge = function( source, k, v){
  47. var i
  48. ,key
  49. ,object
  50. ,l;
  51. if( typeof k == 'string'){
  52. return mergeOne(source,k,v);
  53. }
  54. for( i = 1, l=arguments.length; i< l; i++){
  55. object = arguments[i];
  56. for( key in object ){
  57. mergeOne( source, key, object[key] );
  58. }
  59. }
  60. return source;
  61. };
  62. /**
  63. * Recursivly clones objects. - Be careful of objects with circular references of Deeply nested objects to avoid Exceeded maximum recursion errors
  64. * @param {Object} obj The object to clone
  65. * @returns {Object} A new object that matches the passed in object
  66. */
  67. exports.clone = function(object){
  68. var cln
  69. ,key;
  70. cln = {};
  71. for( key in object ){
  72. cln[key] = cloneOf( object[key] );
  73. }
  74. return cln;
  75. };