Package Exports
- copy-props
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (copy-props) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
copy-props

Copy properties deeply between two objects.
Install
$ npm i copy-props --save
Usage
Load this module :
const copyProps = require('copy-props');
Copy src to dst simply (and return dst) :
var src = { a: 1, b: { b1: 'bbb' }, c: 'ccc' }; var dst = { a: 2, b: { b1: 'xxx', b2: 'yyy' } }; copyProps(src, dst); // => { a: 1, b: { b1: 'bbb', b2: 'yyy' }, c: 'ccc' }
Copy src to dst with property mapping (and return dst) :
var src = { a: 1, b: { b1: 'bbb' }, c: 'ccc', d: 'ddd' }; var dst = { f: { a: 2, b1: 'xxx', b2: 'yyy' }, e: 'zzz' }; copyProps(src, dst, { a: 'f.a', 'b.b1': 'f.b.b1', 'b.b2': 'f.b.b2', 'c': 'f.c', }); // => { f: { a: 1, b1: 'bbb', b2: 'yyy', c: 'ccc' }, e: 'zzz' }
Copy src to dst with convert function (and return dst) :
var src = { a: 1, b: { b1: 'bbb' } }; var dst = { a: 0 }; copyProps(src, dst, function(value, keychain) { if (keychain === 'a') { return value * 2; } if (keychain === 'b.b1') { return value.toUpperCase(); } }); // => { a: 2, b: { b1: 'BBB' } }
Can use an array instead of a map as property mapping :
var src = { a: 1, b: { c: 'CCC' }, d: { e: 'EEE' } }; var dst = { a: 9, b: { c: 'xxx' }, d: { e: 'yyy' } }; var fromto = [ 'a.b.c', 'd.e' ]; copyProps(src, dst, fromto); // => { a: 1, b: { c: 'CCC' }, d: { e: 'EEE' } }
Can copy reversively (from dst to src) by reverse flag (and return src):
var src = { a: 1, b: { b1: 'bbb' }, c: 'ccc' }; var dst = { a: 2, b: { b1: 'xxx', b2: 'yyy' } }; copyProps(src, dst, true); // => { a: 2, b: { b1: 'xxx', b2: 'yyy' }, c: 'ccc' }
var src = { a: 1, b: { b1: 'bbb' }, c: 'ccc', d: 'ddd' }; var dst = { f: { a: 2, b1: 'xxx', b2: 'yyy' }, e: 'zzz' }; copyProps(src, dst, { a: 'f.a', 'b.b1': 'f.b1', 'b.b2': 'f.b2', 'c': 'f.c', }, true); // => { a: 2, b: { b1: 'bbb', b2: 'yyy' }, c: 'ccc', d: 'ddd' }
If a value of source property is undefined (when not using converter), or a result of converter is undefined (when using converter), the value is not copied.
var src = { a: 'A', b: undefined, c: null, d: 1 }; var dst = { a: 'a', b: 'b', c: 'c' }; copyProps(src, dst, function(value, key) { if (key === 'd') { return undefined; } else { return value; } }); // => { a: 'A', b: 'b', c: null }
API
copyProps(src, dst [, fromto] [, converter] [, reverse]) => object
Copy properties of src to dst deeply. If fromto is given, it is able to copy between different properties. If converter is given, it is able to convert the terminal values.
Arguments:
- src [object] : a source object of copy.
- dst [object] : a destinate object of copy.
- fromto [object | array] : an object mapping properties between src and dst. (optional)
- converter [function] : a function to convert terminal values in src. (optional)
- reverse [boolean] : copys reversively from dst to src and returns src object.
fromto
is also reversively used from value to key. This default value isfalse
. (optional)
Return [object] : dst object after copying.
Format of fromto
fromto is a non-nested key-value object. And the keys are property key chains of src and the values are property key chains of dst.
The key chain is a string which is concatenated property keys on each level with dots, like 'aaa.bbb.ccc'
.
The following example copys the value of src.aaa.bbb.ccc
to dst.xxx.yyy
.
copyProps(src, dst, {
'aaa.bbb.ccc' : 'xxx.yyy'
})
fromto can be an array. In that case, the array works as a map which has pairs of same key and value.
API of converter
converter(value, keychain) => any
converter is a function to convert terminal values of propeerties of src.
Arguments:
- value [any] : a property value to be converted.
- keychain [string] : a string of property keys concatenated with dots.
Return: [any] : converted value.
License
Copyright (C) 2016 Takayuki Sato
This program is free software under MIT License. See the file LICENSE in this distribution for more details.