inplace-copy
v0.1.3
Published
## Description `inplace-copy` deeply copy object to object in-place. In-place copying, so it does not break data references. Therefore, if the data content is the same, reactive data triggers by vue watch, computed, etc. will not fire.
Downloads
85
Readme
inplace-copy
Description
inplace-copy
deeply copy object to object in-place.
In-place copying, so it does not break data references.
Therefore, if the data content is the same, reactive data triggers by vue watch, computed, etc. will not fire.
Following features,
- Deep copy object to object
- Customize how to copy array content
- Instance-specific copying methods (eg: Date)
Install
npm install inplace-copy
Usage
const copy = deepCopy()
const xs = {a: {b: 1}}
const ys = {a: {b: 2}, c: 3}
const zs = copy(xs, ys)
// typeof zs is now same as ys
console.log(zs) // {a: {b: 2}, c: 3}
console.log(Object.is(zs, xs)) // true
console.log(Object.is(zs.b, xs.b)) // true
Options
keyOfObject
Arrays are copied by default based on position.
const copy = deepCopy()
const xs = [{a: 1}]
const ys = [{b: 2}]
const zs = copy(xs, ys)
console.log(zs) // [{b: 2}]
For arrays, it is not a good practice to rely only on the position of the values inside to copy.
Therefore, we can specify a method to check if the objects in the array are identical.
const keyOfObject = (v: any, i: index) => v.id
const copy = deepCopy({ keyOfObject })
const bob = {id: 'bob', age: 20}
const xs = [bob]
const ys = [{id: 'mary', age: 19}, {id: 'bob', age: 21}]
const zs = copy(xs, ys)
console.log(zs) // [{id: 'mary', age: 19}, {id: 'bob', age: 21}]
console.log(Object.is(zs, xs)) // true
console.log(Object.is(zs[1], bob)) // true
copyMethods
You can customize how objects are copied by specifying a two-element tuple consisting of a function to determine the runtime type and the copy method.
This is useful for built-in Date types and user-defined type copying, including functions.
const isDate = (v: Date): v is Date => v instanceof Date
const copyDate = (target: any, source: Date, next: any) => {
target.setTime(source.getTime())
return target
}
const copy = deepCopy({ copyMethods: [[isDate, copyDate]] })
const xst = new Date('1995-12-17T03:24:00')
const xs = {a: xst}
const yst = new Date('1995-12-17T03:24:00')
const ys = {a: yst}
const copy = deepCopy({ copyMethods: [[isDate, copyDate]] })
const zs = copy(xs, ys)
console.log(zs.a, xst) // true, xst is modified