You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					47 lines
				
				1.2 KiB
			
		
		
			
		
	
	
					47 lines
				
				1.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								var clone = require('./clone');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = merge;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function typesMatch(a, b) {
							 | 
						||
| 
								 | 
							
								  return (typeof a === typeof b) && (Array.isArray(a) === Array.isArray(b));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * A deep merge of the source based on the target.
							 | 
						||
| 
								 | 
							
								 * @param  {Object} source   [description]
							 | 
						||
| 
								 | 
							
								 * @param  {Object} target   [description]
							 | 
						||
| 
								 | 
							
								 * @return {Object}          [description]
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function merge(source, target, result) {
							 | 
						||
| 
								 | 
							
								  if (result === undefined) {
							 | 
						||
| 
								 | 
							
								    result = clone(source);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // merge missing values from the target to the source
							 | 
						||
| 
								 | 
							
								  Object.getOwnPropertyNames(target).forEach(function (key) {
							 | 
						||
| 
								 | 
							
								    if (source[key] === undefined) {
							 | 
						||
| 
								 | 
							
								      result[key] = target[key];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Object.getOwnPropertyNames(source).forEach(function (key) {
							 | 
						||
| 
								 | 
							
								    var value = source[key];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (target[key] && typesMatch(value, target[key])) {
							 | 
						||
| 
								 | 
							
								      // merge empty values
							 | 
						||
| 
								 | 
							
								      if (value === '') {
							 | 
						||
| 
								 | 
							
								        result[key] = target[key];
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (Array.isArray(value)) {
							 | 
						||
| 
								 | 
							
								        if (value.length === 0 && target[key].length) {
							 | 
						||
| 
								 | 
							
								          result[key] = target[key].slice(0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      } else if (typeof value === 'object') {
							 | 
						||
| 
								 | 
							
								        result[key] = merge(value, target[key]);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return result;
							 | 
						||
| 
								 | 
							
								}
							 |