Skip to content

Instantly share code, notes, and snippets.

@ygnoh
Last active July 10, 2023 01:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ygnoh/62b1bfc23ead117ff5c88cd8545106fc to your computer and use it in GitHub Desktop.
Save ygnoh/62b1bfc23ead117ff5c88cd8545106fc to your computer and use it in GitHub Desktop.
JavaScript diff two strings
const str0 = "01234567";
const str1 = "01234567"; // same
const str2 = "012abc34567"; // inserted
const str3 = "012abc7" // replaced and decreased
const str4 = "012abcdefg67" // replaced and increased
const str5 = "012abc67" // resplaced
const str6 = "kk"; // all replaced
const str7 = "012367"; // middle removed
const str8 = "01234567890" // appended
const str9 = "8901234567" // prepended
const str10 = "1234567" // front removed
const str11 = "0123456" // rear removed
const str12 = "01231234567"; // same string appeared
const str13 = ""; // empty
const diff = (before, after) => {
let start = -1;
let end;
for (let i = 0; i < after.length; i++) {
if (after[i] !== before[i]) {
break;
}
start = i;
}
before = before.substring(start + 1);
after = after.substring(start + 1);
const beforeLength = before.length;
const afterLength = after.length;
end = afterLength;
for (let i = 1; i <= afterLength; i++) {
if (after[afterLength - i] !== before[beforeLength - i]) {
break;
}
end = afterLength - i;
}
return [start, end + start + 1];
};
const deepEqual = (arr1, arr2) => arr1.every((el, i) => el === arr2[i]);
console.assert(deepEqual(diff(str0, str1), [7, 8]));
console.assert(deepEqual(diff(str0, str2), [2, 6]));
console.assert(deepEqual(diff(str0, str3), [2, 6]));
console.assert(deepEqual(diff(str0, str4), [2, 10]));
console.assert(deepEqual(diff(str0, str5), [2, 6]));
console.assert(deepEqual(diff(str0, str6), [-1, 2]));
console.assert(deepEqual(diff(str0, str7), [3, 4]));
console.assert(deepEqual(diff(str0, str8), [7, 11]));
console.assert(deepEqual(diff(str0, str9), [-1, 2]));
console.assert(deepEqual(diff(str0, str10), [-1, 0]));
console.assert(deepEqual(diff(str0, str11), [6, 7]));
console.assert(deepEqual(diff(str0, str12), [3, 7]));
console.assert(deepEqual(diff(str0, str13), [-1, 0]));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment