When given two arrays, this module creates patches that let you modify the first
array into the second one. This is especially useful for HTTP PATCH
methods (when
you only want to send the changes) or just to get a overview of what changed between
two given arrays.
const { createPatch, applyPatch } = require('array-patch')
var arr1 = [1, 2, 3, 4, 5]
var arr2 = [1, 3, 4, 6]
var patch = createPatch(arr1, arr2)
console.log(applyPatch(arr1, patch))
// => [1, 3, 4, 6]
Applying a produced patch always transforms the first array into the second. If you find a case where the resulting patched array is not equal to the given second array, please file an issue.
This module works by first building a list of unchanged couples using
object-hash
. This works very well for most cases
but imagine the following scenario:
var arr1 = ['foo', 'bar', 'baz']
var arr2 = ['foo', 'blub', 'bar1', 'baz']
Visibly it's clear that we inserted a new entry 'blub' into the second array and changed the value of the entry 'bar' to 'bar1'. But because the hashes obviously change when the value changes, the result in this case would be that we have a change from 'bar' to 'blub' and a new entry 'bar1'.
To catch those unnecessary changes you can give a compare
function. This will
be applied for the cases where it's not entirely clear and there are multiple
possible candidates.
The arguments for the function will be the value from the initial array and the
possible value from the second array. If the value changed, the function must
return true
, otherwise false
.
This example can be implemented like the following:
var arr1 = ['foo', 'bar', 'baz']
var arr2 = ['foo', 'blub', 'bar1', 'baz']
var patch = createPatch(arr1, arr2, (val1, val2) => {
if (val2.indexOf(val1) > -1) return true
return false
})
console.log(patch)
// => [ { type: 'insertion', index: 0, value: 'blub' },
// { type: 'change', index: 1, value: 'bar1' } ]
This module runs on node >= 8
and modern browsers using Browserify
or Webpack.
The tests are implemented in tests/
using tape. Run them with npm test
.
If you find any issues, please file them on the Github repo. If
you submit pull requests, please make sure that the tests (npm test
) pass.