【问题标题】:How do I avoid looping through an array to find a partial match?如何避免遍历数组以查找部分匹配?
【发布时间】:2011-02-23 15:46:35
【问题描述】:

我正在遍历一组英语短语,如果找到匹配项,则使用当前文本节点,我将其替换为 non_english 数组中的翻译。对于完全匹配,所有这些都 100% 有效。

但是对于部分匹配,我需要使用 .match 命令,它允许部分匹配。

我搜索完全匹配的代码是这样的:

找到的变量 = $.inArray(value,en_lang);

如果找到值,则替换文本。这种方法速度很快,我很喜欢。

但是要进行部分单词/短语匹配,我必须使用这个循环代码。

// loop thru language arrays
for (var x = en_count; x > 0; x--) {

// assign current from/to variables for replace
var from = en_lang[x];
var to = other_lang[x];

// if value match do translation
if (value.match(from)) {
    content(node, value.replace(from, to));
}

// mark this node as translated
if ($.browser.msie == 'false') {
    $(node).data('translated', 'yes');
}

}

这可以完成工作,但速度很慢。经过大量研究,我发现我可以通过 join 命令将英文数组转换为基于列表的字符串。

但我无法想出一个函数来搜索此列表中的部分匹配,并返回列表中的位置。

我正在尝试这个 2006 年创建的旧 js 函数。但我不知道如何正确地恢复位置。

function listfind(list, value, delimiters) {

    if (!delimiters) {
        var delimiters = ','
    }

    _TempListSplitArray = list.split(delimiters)

    var FoundIdx = 0;

    for (i = 0; i < _TempListSplitArray.length; i++) {
        if (_TempListSplitArray[i] == value) {
            FoundIdx = i + 1;
            break
        }
        if (value.match(_TempListSplitArray[i])) {
            FoundIdx = i + 1;
            break
        }
    }
    return FoundIdx
}

感谢您的宝贵时间。

【问题讨论】:

  • :contains in jquery 处理部分搜索api.jquery.com/contains-selector 我唯一能想到的是它可能不适用于非元素,所以你可以考虑一下,stackoverflow.com/questions/1789945/javascript-string-contains希望有帮助
  • 但这是一个选择器,我已经有了我需要的元素,现在我需要在当前文本节点内搜索部分匹配。
  • 您是否有理由不能一起跳过数组的拆分/循环,而只是在大字符串上用正则表达式进行查找替换?
  • 什么是“部分匹配”?你能提供一个带有具体价值的简短例子吗?
  • 这就是这个问题的目的,找到一种不循环的方法。什么样的正则表达式?特别是因为我会将它们应用于保存当前节点文本的变量。

标签: javascript jquery language-translation


【解决方案1】:

Javascript 有一个 foreach 类型的系统,但它仍然基于循环

var array = ['hello', 'world'];
for(var key in array){
  alert(array[key]);
}

这是循环数组的最佳方法,但这种方式也适用于对象

var obj = {'one':'hello', 'two':'world'];
for(var key in obj){
   alert("key: "+key+" value: "+obj[key]);
}

已更新对您的问题的评论 你可以只替换你知道的文本

var str = "hello World";
str = str.replace("hello", "Bye bye");
alert(str);

【讨论】:

  • 但我的目标是避免循环,因为它们在这种情况下尤其是性能很重。
  • 抱歉,唯一的其他方法是了解您的阵列顺序并使用访问权限而无需通过它。
  • 我的意思是,如果您不必遍历所有值,则不要存储您需要访问和使用的密钥,否则您会陷入内存消耗循环,抱歉 JavaScript 不会有实力还是PHP
  • 存储密钥?你是什​​么意思?理解逻辑流程 1st。 1. 遍历所有文本节点,2. 查找数组中节点当前文本的完全匹配,3. 通过遍历数组然后使用 value.match 查找部分匹配项来工作。但问题是循环方法耗时太长。并且 $.inArray 仅适用于完全匹配。还有其他想法吗?
  • 我只能说看看phpjs.org它可能会给你你需要的功能
猜你喜欢
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多