#516·jsdiff

性能改进建议

作者: 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