[英]JavaScript procedure to find the characters that are in one string but not in another
我一直在尝试写一个,而且越来越乱!
假设我有两个字符串textStart
, textTarget
并且我想跟踪为了生成textTarget
而需要从textStart
添加和删除的textTarget
。
例如,如果textStart
= "dude"
和textTarget
= "deck"
,则需要添加的字符将为'c'
和'k'
,而需要减去的字符将为'u'
和一个'd'
s。
我在想我首先需要创建表示textStart
和textTarget
中每个字符的数量的textTarget
。
所以我这样写:
var startChars = {};
for (var k = 0, n = textStart.length; k < n; ++k)
{
if (textStart[k] in startChars)
++startChars[textStart[k]];
else
startChars[textStart[k]] = 1;
}
var targetChars = {};
for (var k = 0, n = textTarget.length; k < n; ++k)
{
if (textTarget[k] in startChars)
++targetChars[textTarget[k]];
else
map1[targetChars[k]] = 1;
}
那会给我
startChars['d']
= 2
, startChars['u']
= 1
, startChars['e']
= 1
和
targetChars['d']
= 1
, targetChars['e']
= 1
, targetChars['c']
= 1
, targetChars['k']
= 1
然后,我可以创建创建地图needAdded
和needRemoved
,以查看以上两个地图的区别:
var needAdded = {};
var needRemoved = {};
我不确定如何按预期填充这些地图,因为我不知道如何使用JavaScript遍历地图的键。 我某种程度上需要结束
needAdded['c']
= 1
, needAdded['k']
= 1
, needRemoved['u']
= 1
, needRemoved['d']
= 1
那是你们来帮助我的地方。
我希望我做得很好,描述了我现在正在努力做的事情以及如何去做。 我的编程直觉告诉我,我写了太多的代码行,需要向StackOverflow寻求帮助。 没有JQuery或Regex,有什么优雅的方法吗? 我知道有人会进入这个线程并编写一线正则表达式解决方案或类似的东西。
var s = 'dude',
t = 'deck',
finalOutput = '';
for (var i = 0; i < s.length; i++){
if ( typeof t[i] != 'undefined' ){
if ( s[i] != t[i] ){
console.log(s[i] + ' changed to ' + t[i]);
s[i] = t[i];
finalOutput += t[i];
} else{
finalOutput += s[i];
}
}
}
console.log('FINAL: ' + finalOutput);
这是一个我花了太多时间的jsfiddle ...希望这是有意义的:)
var textStart = 'dude';
var textTarget = 'deck';
var startChars = {};
for (var k = 0, n = textStart.length; k < n; ++k)
{
if (textStart[k] in startChars)
++startChars[textStart[k]];
else
startChars[textStart[k]] = 1;
}
var targetChars = {};
for (var k = 0, n = textTarget.length; k < n; ++k)
{
if (textTarget[k] in targetChars)
++targetChars[textTarget[k]];
else
targetChars[textTarget[k]] = 1;
}
console.log('start: ' + JSON.stringify(startChars));
console.log('target: ' + JSON.stringify(targetChars));
var needAdded = {};
var needRemoved = {};
for (var c in startChars) {
// If target does not contain letter, remove all, otherwise remove excess
if (targetChars[c] > 0) {
if (startChars[c] > targetChars[c])
needRemoved[c] = startChars[c] - targetChars[c];
else if (startChars[c] < targetChars[c])
needAdded[c] = targetChars[c] - startChars[c];
} else {
needRemoved[c] = startChars[c];
}
}
for (var c in targetChars) {
// If start does not contain letter, add all, otherwise add excess
if (startChars[c] > 0) {
if (startChars[c] > targetChars[c])
needRemoved[c] = startChars[c] - targetChars[c];
else if (startChars[c] < targetChars[c])
needAdded[c] = targetChars[c] - startChars[c];
} else {
needAdded[c] = targetChars[c];
}
}
console.log('needAdded: ' + JSON.stringify(needAdded));
console.log('needRemoved: ' + JSON.stringify(needRemoved));
输出如下:
start: {"d":2,"u":1,"e":1}
target: {"d":1,"e":1,"c":1,"k":1}
needAdded: {"c":1,"k":1}
needRemoved: {"d":1,"u":1}
好的,在此上也花了太多时间:
var textStart = "dude";
var textTarget = "duck";
var map = {};
MapCharacters(textStart, map, 1);
MapCharacters(textTarget, map, -1);
console.log(map);
var toDelete = [];
var toAdd = [];
for (var prop in map) {
if (map.hasOwnProperty(prop)) {
while (map[prop] > 0) {
toDelete.push(prop);
map[prop]--;
}
while (map[prop] < 0) {
toAdd.push(prop);
map[prop]++;
}
}
}
console.log(toDelete);
console.log(toAdd);
function MapCharacters(string, map, add) {
for (var k = 0, n = string.length; k < n; ++k) {
if (string[k] in map) {
map[string[k]] += add;
} else {
map[string[k]] = add;
}
}
}
可能可以更有效地完成它,但是正如我所说-太多的时间!
我意识到最好的方法不是制作两张地图,而只是制作一张。 在第一种情况下,增加每个字母的计数,在第二种情况下,减少计数。 现在,很容易找到需要删除的那些(结束的> 0)和需要添加的那些(结束的<0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.