将字符串差异计算为范围
Calculate string difference as range
我试图找出用户在字符串中更改了哪些字符。幸运的是,我可以假设只有一个随之而来的更改块。
我什至找不到更改区域开始的位置:
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;
}
}
如果有一行相同的字符并且用户删除中间的一个字符,这将完全中断:
唰�
� 米米毫米X
唔��
脚本会说更改发生在 4 点,x
移动的地方。但事实上,似乎甚至无法说出哪个m
被删除了。
但是,我可以分辨出光标位置在开始时的位置和结尾的位置。这样看起来更有希望,但我仍然不知道该怎么办:
毫米|毫米X
米|米
m|mmx
这次我可以看到哪个m
被删除了。但我仍然不知道如何向计算机解释它。
这是我认为您可能正在寻找的内容。请澄清您的问题。
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>
相关文章:
- 正在全局范围中查找JavaScript函数
- 如何从范围滑块动态值计算输入值
- 对于使用传递的数据计算的局部范围变量,角度绑定在自定义指令中不起作用
- Angularjs:访问范围变量数组并计算平均值
- 计算时间范围并将其保存到文件
- JavaScript 算法性能 - 计算可被 k 整除的范围内的数字数
- 计算给定日期范围内的星期一
- 计算范围内的整数
- D3.js:计算随范围变化的时间尺度上的柱线宽度
- 在范围变量更改后重新计算传递给指令的属性
- 将字符串差异计算为范围
- javascript计算日期范围的价格
- 可以't计算html输入类型范围的值
- 什么是最好的方法来计算字符数在html dom节点(在文档节点使用javascript范围库)
- Javascript根据CIDR前缀计算IPv6范围
- 使用计算的可观察性的对象范围
- 从开始 - 结束日期和时间 (UTC) 计算出日期范围
- 算法-计算范围上的缺口值
- 如何使用lodash来计算许多范围,如X< 10,10
- 以月为单位计算给定日期范围内的天数,使用momentjs计算天数