merge-deep-composed
Recursively merge javascript object values with composed extension methods
Inspired by merge-deep with extensible control over how merging is performed.
Install
$ npm install --save merge-deep-composed
TAP
Testing via$ npm -s test
TAP version 13
1..11
ok 1 - smoke
ok 2 - example/ex_arrays.js
ok 3 - example/ex_log.js
ok 4 - example/ex_objects.js
ok 5 - merge objects
ok 6 - merge array replace
ok 7 - merge array append absent
ok 8 - merge array incremental
ok 9 - merge array incremental disjoint
ok 10 - merge object with log
ok 11 - merge object with enter exit log
Or with test with faucet:
$ npm -s test | faucet
✓ smoke
✓ example/ex_arrays.js
✓ example/ex_log.js
✓ example/ex_objects.js
✓ merge objects
✓ merge array replace
✓ merge array append absent
✓ merge array incremental
✓ merge array incremental disjoint
✓ merge object with log
✓ merge object with enter exit log
Use
Merge certain objects a different way
const mergeDeep = let a: 'aa' b: c: msg: 'source cc' value: 2042 base: 'from-base' d: 'dd' let b: c: msg: 'capture me' value: 1942 overlay: 'from-overlay' d: 'DD' // "Merge" by replacement assert // Merge objects differently by path const merge_ns = mergeDeep assert // Merge values differently by path const merge_item = mergeDeep assert
Merge arrays just so…
const mergeDeep = let a: 'aa' b: list: 369 c: 'cc' d: 'dd' let b: list: 126711912 c: 'CC' d: 'DD' // "Merge" by replacement assert // Or merge by appending the missing items const merge_append = mergeDeep assert // Or merge roughly incrementally const merge_incremental = mergeDeep assert // Or whatever you want const merge_extensible = mergeDeep assert
Log merge actions
let a: 'aa' b: c: msg: 'source cc' value: 2042 base: 'from-base' d: 'dd' let b: c: msg: 'capture me' value: 1942 overlay: 'from-overlay' d: 'DD' const merge_log = assert
API
const merge_deep_api = { // Called at start of `deepMergeOnto(target, ...argObjects)`. // Return value to use as api. (e.g. Object.create(api)) return api } { // Called at end of `deepMergeOnto(target, ...argObjects)`. return target } { // Called at top of _mergeDeepOne. // Any return is passed out of _mergeDeepOne. } { // Called at top of loop in _mergeDeepOne. // Any return overrides other logic. } { // Called to merge two objects. // Recursion ensues if no value is returned (undefined). return undefined } { // Called to merge two arrays. // Default is to replace with `src`. return src } { // Called to merge two mismatched "values". // Default is to replace with `src`. return src } { // Called to merge if a more specific method is not present. // Default is to replace with `src`. return src } { // called at the bottom of the loop to commit (key, value) pair targetkey = value } { // called at top of _mergeDeepOne // any return is passed out of _mergeDeepOne return target }