@n1ru4l/json-patch-plus
Version:
This is a slimmed version of [jsondiffpatch](https://github.com/benjamine/jsondiffpatch). All the code is taken from the [jsondiffpatch](https://github.com/benjamine/jsondiffpatch) repository, slimmed down, slightly altered and converted to TypeScript.
77 lines (76 loc) • 2.54 kB
JavaScript
/**
* LCS implementation that supports arrays or strings
*
* reference: http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.get = exports.backtrack = exports.lengthMatrix = exports.defaultMatch = void 0;
function defaultMatch(array1, array2, index1, index2) {
return array1[index1] === array2[index2];
}
exports.defaultMatch = defaultMatch;
function lengthMatrix(array1, array2, match, context) {
const len1 = array1.length;
const len2 = array2.length;
// initialize empty matrix of len1+1 x len2+1
let matrix = Object.assign([len1 + 1], {
match,
});
for (let x = 0; x < len1 + 1; x++) {
matrix[x] = [len2 + 1];
for (let y = 0; y < len2 + 1; y++) {
matrix[x][y] = 0;
}
}
// save sequence lengths for each coordinate
for (let x = 1; x < len1 + 1; x++) {
for (let y = 1; y < len2 + 1; y++) {
if (match(array1, array2, x - 1, y - 1, context)) {
matrix[x][y] = matrix[x - 1][y - 1] + 1;
}
else {
matrix[x][y] = Math.max(matrix[x - 1][y], matrix[x][y - 1]);
}
}
}
return matrix;
}
exports.lengthMatrix = lengthMatrix;
function backtrack(matrix, array1, array2, context) {
let index1 = array1.length;
let index2 = array2.length;
const subsequence = {
sequence: [],
indices1: [],
indices2: [],
};
while (index1 !== 0 && index2 !== 0) {
const sameLetter = matrix.match(array1, array2, index1 - 1, index2 - 1, context);
if (sameLetter) {
subsequence.sequence.unshift(array1[index1 - 1]);
subsequence.indices1.unshift(index1 - 1);
subsequence.indices2.unshift(index2 - 1);
--index1;
--index2;
}
else {
const valueAtMatrixAbove = matrix[index1][index2 - 1];
const valueAtMatrixLeft = matrix[index1 - 1][index2];
if (valueAtMatrixAbove > valueAtMatrixLeft) {
--index2;
}
else {
--index1;
}
}
}
return subsequence;
}
exports.backtrack = backtrack;
function get(array1, array2, match, context) {
const innerContext = context || {};
const matrix = lengthMatrix(array1, array2, match || defaultMatch, innerContext);
return backtrack(matrix, array1, array2, innerContext);
}
exports.get = get;
;