Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS变量将其他变量拉入其中_Javascript_Regex - Fatal编程技术网

Javascript JS变量将其他变量拉入其中

Javascript JS变量将其他变量拉入其中,javascript,regex,Javascript,Regex,我知道这个问题的标题似乎很模糊,但这是因为我根本不知道如何恰当地总结它 我正在做一个项目,在那里我输入一些文本,然后将其翻译成其他内容 有一个 如果我输入4,它将转换为的单词 如果我输入b4,它应该在之前转换为 相反,它转换为b或,因为它将变量4作为一个单独的变量捕获 我试过改变顺序,但没用。这是正则表达式的问题吗 我的变量在JS中标识 var replaceValues = { '4' : 'for', 'b4' : 'before' } $('.bs-text').keyu

我知道这个问题的标题似乎很模糊,但这是因为我根本不知道如何恰当地总结它

我正在做一个项目,在那里我输入一些文本,然后将其翻译成其他内容

有一个

如果我输入4,它将转换为的单词

如果我输入b4,它应该在之前转换为

相反,它转换为b或,因为它将变量4作为一个单独的变量捕获

我试过改变顺序,但没用。这是正则表达式的问题吗

我的变量在JS中标识

var replaceValues = {
    '4' : 'for',
    'b4' : 'before'
}

$('.bs-text').keyup(function (event) {
    newText = event.target.value;
    for (var txt in replaceValues) {
        var temp = new RegExp(txt, 'gim');
        newText = newText.replace(temp, replaceValues[txt]);
    }
    $('.human-text').text(newText);
});

对象属性的属性值中包含
:“
字符

$('.bs-text').keyup(function (event) {
    var newText = event.target.value;
    if (replaceValues[newText]) {
      $('.human-text').text(replaceValues[newText])
    };        
});

正如我在评论中指出的,jsiddle对象没有定义键的顺序,因此当您知道字典将变得更大时,依靠它不是一个好主意

关于这一点,请参见另一个问题:

取而代之的是,使用具有您定义的顺序的简单数组。这个字典数组的排序也可以在JS中完成,您不需要自己处理

var replaceValues = [
  {key: '4', value: 'for'},
  {key: 'b4', value: 'before'},
];

// sort the values so longer keys go first
replaceValues.sort((a, b) => b.key.length - a.key.length);

$('.bs-text').keyup(function (event) {
    var newText = event.target.value;
    for (var txt in replaceValues) {
        var replacement = replaceValues[txt];
        var temp = new RegExp(replacement.key, 'gim');
        newText = newText.replace(temp, replacement.value);
    }
    $('.human-text').text(newText);
});
您也可以使用ES6
Map
,它应该有订单保证。但请注意,仅从对象创建映射是不够的:

映射对象按插入顺序迭代其元素-for…of循环为每次迭代返回一个[key,value]数组

应该注意的是,作为对象映射的映射,尤其是字典字典,将只映射到对象的插入顺序,该顺序是随机的,而不是有序的


如评论中所述,您必须首先查找最长的匹配项。一个选项是从搜索词中生成一个正则表达式(按长度排序),并获得正确的替换值

var replaceValues={
‘4’:‘for’,
“b4”:“之前”
};
//生成相当于“/b4 | 4/gmi”的内容`
var pattern=newregexp(
对象。键(替换值)
.sort((a,b)=>b.length-a.length)
.join(“|”),
“gmi”
);
var newText='4me b4me';

log(newText.replace(pattern,match=>replaceValues[match])你需要先替换较大的…我建议对替换进行重要性排序,因为根据情况,一次替换可能优先于另一次。虽然埃帕斯卡雷罗的评论有一定的价值,但它可能没有涵盖你试图实现的每一个具体细节。当然,这将需要更多的工作,但我宁愿有保证,而不是简洁或轻松。我修复了打字错误。。。还是不为我工作。b4显示为bfor。。。而且应该是在之前。对我来说,在订单上来回移动不会改变任何事情。JS对象没有定义项目的顺序。它可能适用于较少的对象字段,但如果字典更大,您可能会遇到一些奇怪的情况。@MartinAdámek-字典的目的是要变得更大。我希望有一种方法,我不必为此创建自定义正则表达式。非常感谢您的任何想法。根据关键字长度对数组进行排序可能比手动维护单词的正确顺序更容易,尤其是当单词数量增加时。这是真的,这将添加一个注释。