性能改进建议
作者: toptensoftware创建于 2024年4月23日更新于 2024年4月23日
// callback(op, index, count) where op = "insert" or "delete" export function diff(oldArray, newArray, callback, compareEqual) { if (!compareEqual) { compareEqual = function(a, b) { return a == b; } }
// Get the min and max length of the two arrays
let minLength = Math.min(oldArray.length, newArray.length);
let maxLength = Math.max(oldArray.length, newArray.length);
// Work out how many matching items at the start
let trimStart = 0;
while (trimStart < minLength && compareEqual(oldArray[trimStart], newArray[trimStart])) {
trimStart++;
}
// Exact match?
if (trimStart == maxLength) {
return;
}
// Simple Append?
if (trimStart == oldArray.length) {
callback('insert', oldArray.length, newArray.length - oldArray.length);
return;
}
// Work out how many matching items at the end
let trimEnd = 0;
while (trimEnd < (minLength - trimStart) && compareEqual(oldArray[oldArray.length - trimEnd - 1], newArray[newArray.length - trimEnd - 1])) {
trimEnd++;
}
// Simple prepend?
if (trimEnd == oldArray.length) {
callback('insert', 0, newArray.length - oldArray.length);
return;
}
// Simple insert?
if (trimStart + trimEnd == oldArray.length) {
callback('insert', trimStart, newArray.length - oldArray.length);
return;
}
// Simple delete?
if (trimStart + trimEnd == newArray.length) {
callback('delete', trimStart, oldArray.length - newArray.length);
return;
}
// Untrimmed?
if (trimStart == 0 && trimEnd == 0) {
return diff_core(oldArray, newArray, callback, compareEqual);
}
// Trimmed diff - slice the arrays and adjust the indicies on the callbacks
return diff_core(
oldArray.slice(trimStart, -trimEnd),
newArray.slice(trimStart, -trimEnd),
(op, index, count) => callback(op, index + trimStart, count),
compareEqual
);
}
内容来源: kpdecker/jsdiff