繁体   English   中英

JavaScript过程来查找一个字符串中的字符,而不是另一字符串中的字符

[英]JavaScript procedure to find the characters that are in one string but not in another

我一直在尝试写一个,而且越来越乱!

假设我有两个字符串textStarttextTarget并且我想跟踪为了生成textTarget而需要从textStart添加和删​​除的textTarget

例如,如果textStart = "dude"textTarget = "deck" ,则需要添加的字符将为'c''k' ,而需要减去的字符将为'u'和一个'd' s。

我在想我首先需要创建表示textStarttextTarget中每个字符的数量的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'] = 2startChars['u'] = 1startChars['e'] = 1

targetChars['d'] = 1targetChars['e'] = 1targetChars['c'] = 1targetChars['k'] = 1

然后,我可以创建创建地图needAddedneedRemoved ,以查看以上两个地图的区别:

    var needAdded = {}; 
    var needRemoved = {};

我不确定如何按预期填充这些地图,因为我不知道如何使用JavaScript遍历地图的键。 我某种程度上需要结束

needAdded['c'] = 1needAdded['k'] = 1needRemoved['u'] = 1needRemoved['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;
        }
    }
}

http://jsfiddle.net/nSV2J/1/

可能可以更有效地完成它,但是正如我所说-太多的时间!

我意识到最好的方法不是制作两张地图,而只是制作一张。 在第一种情况下,增加每个字母的计数,在第二种情况下,减少计数。 现在,很容易找到需要删除的那些(结束的> 0)和需要添加的那些(结束的<0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM