写一个代码比对工具,想跟git提交代码时一样,可以进行每一行的对比,比如单独行的增加、删除,以及每一行中有些单词的不同,使用的插件是 diff-match-patch,下面大致写一下过程,这个写了个小的组件,里面有相对应的js和vue,连接如下,如果需要可参考 https://blog.csdn.net/weixin_37817251/article/details/116455307(仅供参考)
const DIFF_DELETE = -1; //删除
const DIFF_INSERT = 1; //新增
const DIFF_EQUAL = 0; //相同
使用的主要方法是:diff_linesToChars_和diff_main以及diff_charsToLines_,具体的返回值,如果想去看的话可以打印看一下,下面直接上代码
// text1和text2是左右两侧的文本
function diff_lineMode(text1, text2) {
var dmp = new DiffMatchPatch();
var a = dmp.diff_linesToChars_(text1, text2);
var lineText1 = a.chars1;
var lineText2 = a.chars2;
var lineArray = a.lineArray;
var diffs = dmp.diff_main(lineText1, lineText2, false);
dmp.diff_charsToLines_(diffs, lineArray);
return diffs;//返回的值是一个数组[标识值,相同值,不同的值]
}
由于上面返回的数组 [标识值,相同值,不同的值] 不符合需求,所以就自己整合了一下数组,下面是整合数组的代码,这个可以根据个人需求进行更改
// 处理数据格式
function handleDiff(diffs) {
for (let x = 0; x < diffs.length; x++) {
const op = diffs[x][0]; // Operation (insert, delete, equal),----------只是对于当前行来说----是新增、删除、还是没有更改
switch (op) {
case DIFF_INSERT://1,新增
// 新增时,处理新增的东西
// 清空当前的
diffSingleArr = [];
if (diffs[x - 1]) {
// 判断是不是有上一个
if (diffs[x - 1][0] != -1) {
// 纯新增
onlyAdd(diffs[x][1])
}
} else {
// 纯新增
onlyAdd(diffs[x][1])
}
break;
case DIFF_DELETE://-1 这里需要处理
if (diffs[x + 1]) {
//先判断是不是有下一个
if (diffs[x + 1][0] === 1) {
// 判断下一个是不是不同:只要进里面就说明是不同的,下面不用进行判断了
// 这里面需要进行单个的判断,不能使用diffs[x][1]或者diffs[x + 1][1]
// 要把diffs[x][1]截取成一个一个的,diffs[x + 1][1]也变成一个一个的,然后进行对比
// 在这里进行判断,看看谁长,谁长就遍历谁
// 这个放这里面主要是因为,避免太长的,需要一个一个的进行比对
const textSing1 = diffs[x][1].trimEnd().split(pattern_para);
const textSing2 = diffs[x + 1][1].trimEnd().split(pattern_para);
let textSingLong = textSing1.length > textSing2.length ? textSing1 : textSing2;
let textSingShort = textSing1.length > textSing2.length ? textSing2 : textSing1;
if (textSing1.length === textSing2.length) {
textSingLong = textSing1;
textSingShort = textSing2;
}
// 需要第一行进行,比对,第二行进行比对,依次向下进行比对
if (textSing1.length > textSing2.length) {
proceDataDetails(textSingLong, textSingShort, diffs[x][0], "firstLong")
} else if (textSing1.length < textSing2.length) {
//有新增,有不同:需要有1和-1
proceDataDetails(textSingLong, textSingShort, diffs[x][0], "lastLong")
} else {
//说明每一行都是不同的
proceDataDetails(textSingLong, textSingShort, diffs[x][0], "equalLong")
}
} else {
//只有删除
onlyDelete(diffs[x][1])
}
} else {
//只有删除
onlyDelete(diffs[x][1])
}
break;
case DIFF_EQUAL:
// 0--直接返回
diffSingleArr = [];
diffSingleArr = [diffs[x][0], diffs[x][1], "", ""]
diffRes.push(diffSingleArr)
break;
}
res = {
"diffs": diffRes
}
}
}