Pertanyaan Hitung perbedaan string sebagai rentang


Saya mencoba mencari tahu karakter apa yang telah diubah pengguna dalam string. Saya beruntung dapat berasumsi hanya ada satu blok perubahan konsekuen.

Saya bahkan gagal menemukan di mana area yang diubah dimulai:

var originalVal, val; //strings
//The ranges
var original = [0,0];
var new_rang = [0,0];
//Old length, new length
var ol = originalVal.length;
var nl = val.length;
//Find where the change begins (that should be the same for both arrays)

for(var i=0; ; i++) {
  //If end of string was reached or the strings are different
  if((i>=ol||i>=nl) || originalVal[i]!=val[i]) {
    original[0] = new_rang[0] = i;
    //Set these to i too, assuming there was no change
    original[1] = new_rang[1] = i;
    break;
  }
}  

Ini benar-benar rusak jika ada deretan karakter yang sama dan pengguna menghapus satu di tengah:

mmmmx
  mmmmx
  mmmx

Skrip akan mengatakan bahwa perubahan terjadi pada 4, di mana x terharu. Namun pada kenyataannya, itu bahkan tidak mungkin untuk dikatakan yang  m telah dihapus.

Namun saya bisa tahu di mana posisi kursor berada di awal dan di mana pada akhirnya. Dengan cara itu terlihat lebih menjanjikan, tetapi saya masih tidak tahu apa yang harus dilakukan:

mm | mmx
  mm| mmx
  m | mmx

Kali ini saya bisa melihat mana m telah dihapus. Tapi saya masih tidak tahu bagaimana menjelaskannya ke komputer.


4
2017-11-20 08:01


asal


Jawaban:


Inilah yang menurut saya mungkin Anda cari. Harap klarifikasi pertanyaan Anda.

var Console = function() {
  this.log = function(msg) {
    debug(msg)
  };
};
var console = new Console();

function diffLengths(longer, shorter) {
  var indexes = [];
  var isTheSame = true;
  for (var i = 0; i < shorter.length; i++) {
    if (shorter[i] != longer[i]) {
      isTheSame = false;
      indexes.push(i);
    }
  };
  if (isTheSame) {
    // The shorter string is exactly the same as the longer string
    // except for the extra characters in the longer string
    indexes.push(shorter.length);
  }
  return indexes;
}

function getDiffRange(first_string, second_string) {
  var indexes = [];
  if (first_string.length > second_string.length) {
    return diffLengths(first_string, second_string);
  } else if (first_string.length < second_string.length) {
    return diffLengths(second_string, first_string);
  } else {
    for (var i = 0; i < first_string.length; i++) {
      if (second_string[i] != first_string[i]) {
        indexes.push(i);
      }
    };
  }
  return indexes;
}

var range = getDiffRange('mmmmx', 'mmmx');
document.getElementById('result-1').innerHTML = range[0] + " - " + range[range.length - 1];

var range = getDiffRange('mmmmx', 'mmmxc');
document.getElementById('result-2').innerHTML = range[0] + " - " + range[range.length - 1];

var range = getDiffRange('mm', 'mmx');
document.getElementById('result-3').innerHTML = range[0] + " - " + range[range.length - 1];
table, th, td {
	border-collapse: collapse;
	border: 1px solid #ddd;
	text-align: left;
	padding: 7px;
}
<html>

<body>
  <table>
    <tr>
      <th>input</th>
      <th>result</th>
    </tr>
    <tr>
      <td>'mmmmx', 'mmmx':</td>
      <td id='result-1'></td>
    </tr>
    <tr>
      <td>'mmmmx','mmmxc':</td>
      <td id='result-2'></td>
    </tr>
    <tr>
      <td>'mm','mmx':</td>
      <td id='result-3'></td>
    </tr>
  </table>
</body>

</html>


1
2018-01-28 23:56