{{alias}}( target, ...source ) Merges objects into a target object. The target object is mutated. Only plain objects are merged and extended. Other values/types are either deep copied or assigned. Support for deep merging class instances is inherently fragile. `Number`, `String`, and `Boolean` objects are merged as primitives. Functions are not deep copied. Parameters ---------- target: Object Target object. source: ...Object Source objects (i.e., objects to be merged into the target object). Returns ------- out: Object Merged (target) object. Examples -------- > var target = { 'a': 'beep' }; > var source = { 'a': 'boop', 'b': 'bap' }; > var out = {{alias}}( target, source ) { 'a': 'boop', 'b': 'bap' } > var bool = ( out === target ) true {{alias}}.factory( options ) Returns a function for merging and extending objects. Parameters ---------- options: Object Options. options.level: integer (optional) Merge level. Default: Infinity. options.copy: boolean (optional) Boolean indicating whether to deep copy merged values. Deep copying prevents shared references and source object mutation. Default: true. options.override: boolean|Function (optional) Defines the merge strategy. If `true`, source object values will always override target object values. If `false`, source values never override target values (useful for adding, but not overwriting, properties). To define a custom merge strategy, provide a function. Default: true. options.extend: boolean (optional) Boolean indicating whether new properties can be added to the target object. If `false`, only shared properties are merged. Default: true. Returns ------- fcn: Function Function which can be used to merge objects. Examples -------- > var opts = { ... 'level': 100, ... 'copy': true, ... 'override': true, ... 'extend': true ... }; > var merge = {{alias}}.factory( opts ) // Set the `level` option to limit the merge depth: > merge = {{alias}}.factory( { 'level': 2 } ); > var target = { ... '1': { 'a': 'beep', '2': { '3': null, 'b': [ 5, 6, 7 ] } } ... }; > var source = { ... '1': { 'b': 'boop', '2': { '3': [ 1, 2, 3 ] } } ... }; > var out = merge( target, source ) { '1': { 'a': 'beep', 'b': 'boop', '2': { '3': [ 1, 2, 3 ] } } } // Set the `copy` option to `false` to allow shared references: > merge = {{alias}}.factory( { 'copy': false } ); > target = {}; > source = { 'a': [ 1, 2, 3 ] }; > out = merge( target, source ); > var bool = ( out.a === source.a ) true // Set the `override` option to `false` to preserve existing properties: > merge = {{alias}}.factory( { 'override': false } ); > target = { 'a': 'beep', 'b': 'boop' }; > source = { 'a': null, 'c': 'bop' }; > out = merge( target, source ) { 'a': 'beep', 'b': 'boop', 'c': 'bop' } // Define a custom merge strategy: > function strategy( a, b, key ) { ... // a => target value ... // b => source value ... // key => object key ... if ( key === 'a' ) { ... return b; ... } ... if ( key === 'b' ) { ... return a; ... } ... return 'bebop'; ... }; > merge = {{alias}}.factory( { 'override': strategy } ); > target = { 'a': 'beep', 'b': 'boop', 'c': 1234 }; > source = { 'a': null, 'b': {}, 'c': 'bop' }; > out = merge( target, source ) { 'a': null, 'b': 'boop', 'c': 'bebop' } // Prevent non-existent properties from being added to the target object: > merge = {{alias}}.factory( { 'extend': false } ); > target = { 'a': 'beep', 'b': 'boop' }; > source = { 'b': 'hello', 'c': 'world' }; > out = merge( target, source ) { 'a': 'beep', 'b': 'hello' } See Also --------