diff-match-patch对比使用

申屠鹏
2023-12-01

写一个代码比对工具,想跟git提交代码时一样,可以进行每一行的对比,比如单独行的增加、删除,以及每一行中有些单词的不同,使用的插件是 diff-match-patch,下面大致写一下过程,这个写了个小的组件,里面有相对应的js和vue,连接如下,如果需要可参考 https://blog.csdn.net/weixin_37817251/article/details/116455307(仅供参考)

  1. 使用 npm install diff-match-patch 下载
  2. 定义标识
    const DIFF_DELETE = -1; //删除
    const DIFF_INSERT = 1; //新增
    const DIFF_EQUAL = 0; //相同
    

     

  3.  使用的主要方法是: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;//返回的值是一个数组[标识值,相同值,不同的值]
    }
    

     

  4.  由于上面返回的数组  [标识值,相同值,不同的值]    不符合需求,所以就自己整合了一下数组,下面是整合数组的代码,这个可以根据个人需求进行更改

    // 处理数据格式
    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
        }
      }
    }

     

 类似资料: