merge-util
Just another deep merge function for objects. Merge is recursive for nested objects by default.
Installation
$ component install cristiandouce/merge-util
or..
$ npm install merge-util
Usage
var merge = ; var obj1 = hello: 'World' ;var obj2 = hello: 'World!' good: bye: 'Lennin' ; ; console; // out: "{ hello: 'World!', good: { bye: 'Lennin'}}"
API
merge(obj1, obj2, opts)
Merge obj2
into obj1
with some options.
var obj1 = obj: any: 'thing' ;var obj2 = obj: something: 'wrong?' ;; // out: "{ obj: { something: 'Wrong?', any: 'thing' }}"
Available options include:
-
inheritance
: Defaults tofalse
. Include inherited members in the merge. -
shallow
: Defaults tofalse
. Atrue
value prevents merge from being recursive to nested objects. -
discardEmpty
: Defaults totrue
. Afalse
value makes empty values (as defined byianstormtaylor/is-empty
) in the "right-hand" be preserved as they were instead of being merged asundefined
attributes in the "left-hand" object.
Note: you can also pass a Boolean
as the opts
parameter as value for inheritance
alone. This provides backwards compatibility with version 0.1.0
inheritance
{ thisliving = true;} Youthprototype = ; { thisplays = true;} { thismaterial = "metal";} var bot = ;var kid = ; ; // merge(dog, kid, false); also works as in 0.1.0//out => bot: "{ plays: true, material: 'metal' }" ; // merge(dog, kid, true); also works as in 0.1.0//out => bot: "{ living: true, plays: true, material: 'metal' }"
shallow
var xBuster = name: "X-Buster" power: 600 ;var zeroBlade = name: "Zero Blade" power: 9001 var megaman = name: "Megaman X" weapon: xBuster var zero = name: "Zero" weapon: zeroBlade ; // same as merge(megaman, zero, { shallow: false });//out => megaman: "{ name: "Zero", weapon: { name: "Zero Blade", power: 9001 } }" ;//out: { name: "Zero Blade", power: 9001 }// `xBuster` was merged with `zeroBlade` //If instead we had done this...;//out => megaman: "{ name: "Zero", weapon: { name: "Zero Blade", power: 9001 } }" ;//out: { name: "X-Buster", power: 600 }// `megaman`'s' `weapon` was swapped for `zero`'s, but `xBuster` itself wasn't merged.
discardEmpty
var lameArmor = name: "Lame armor" defense: 10 ;var upgradableArmor = name: "Cool armor" defense: 20 upgrades: var noob = name: "Noob player" armor: lameArmor var veteran = name: "Looking for upgrades" armor: upgradableArmor ; // same as merge(noob, veteran, { discardEmpty: true });//out =>//noob:// { name: "Looking for uprades",// weapon: {// name: "Cool armor",// defense: 20,// upgrades: undefined// }// }// `upgrades` attribute was discarded because it was an empty object. ;//out =>//noob:// { name: "Looking for uprades",// weapon: {// name: "Cool armor",// defense: 20,// upgrades: { }// }// }// `upgrades` attribute was merged as an empty object.
TODO
- Add some tests.
- Add more merge examples.
License
MIT