在Javascript中,ColdFusion的listFindNoCase函数的最快实现是什么?

时间:2012-07-07 00:27:03

标签: javascript algorithm coldfusion

我已经被ColdFusion的列表宠坏了,并且遇到了一个或两个以逗号分隔的列表出现在Javascript中的情况。是否有相当于listFindNoCase('string','list'),或在Javascript中实现它的高效方法?

哦,它应该能够用逗号处理列表项,例如: (“史密斯,约翰”,“母鹿,简”,“等......”)

这才是让我好起来的。

3 个答案:

答案 0 :(得分:4)

仅供参考:jList的实施:https://github.com/davidwaterston/jList

尽管如此,这将使您的要求“它应该能够处理带逗号的列表项”

listFind : function (list, value, delimiter) {
    delimiter = (typeof delimiter === "undefined") ? "," : delimiter;

    var i,
        arr = list.split(delimiter);

    if (arr.indexOf !== undefined) {
        return arr.indexOf(value) + 1;
    }

    for (i = 0; i < list.length; i += 1) {
        if (arr[i] === value) {
            return i + 1;
        }
    }

    return 0;
},


listFindNoCase : function (list, value, delimiter) {
    delimiter = (typeof delimiter === "undefined") ? "," : delimiter;

    list = list.toUpperCase();
    value = String(value).toUpperCase();

    return this.listFind(list, value, delimiter);
},

答案 1 :(得分:3)

这里的一个相关观察是CF列表自己不支持定界符char也是数据的一部分。您的样本&#34;列表&#34; &#39;&#34;史密斯,约翰&#34;,&#34; Doe,Jane&#34;&#39;是一个四个元素的逗号分隔列表&#39;&#39;&#39;&#39; John&#34;&#39;&#39;&#39;&#34;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39 ; Doe&#39;,&#39; Jane&#34;&#39;。为了满足您的要求,您 想要一个与JS listFindNoCase()相当的JS,因为listFindNoCase()实际上并不满足您对CF的要求透视,CF没有任何原生。要处理具有嵌入逗号的元素,您需要使用不同的char作为分隔符。

TBH,CF列表有点垃圾(由于上面提到的原因),因为它们只在非常普通的情况下才真正有用,a)经常不会出现; b)无论如何都不能通过数组提供更好的服务。这里要做的一个观察是你在这里询问一个高效的解决方案:不使用基于字符串的列表将是性能的第一步(这同样适用于CF,因为它对JS:CF&# 39;基于字符串的列表根本没有表现。)

所以我的第一个答案是:我认为你应该修改你的要求而不是使用列表,而是寻找使用数组。

考虑到这一点,数据是如何进入JS的?你是否坚持使用基于字符串的列表?如果不是:根本不要。如果您的源数据是基于字符串的列表,您是否可以先将其转换为数组?您在&#34;架构&#34;中遇到了麻烦。我之前提到过的示例列表:从CF的角度来看,您不能使用逗号作为分隔符和数据。在编写代码以确定引用的逗号是数据,而未引用的逗号是分隔符之前,您确实需要做一些工作。您应该浏览一下CSV解析算法来处理这类事情。

但是,如果您可以更改分隔符(例如管道或分号或不会在数据中显示的内容),那么它很容易将其转换为数组(listToArray()在CF中,或在JS中的split())。然后你可以像其他人所说的那样使用indexOf()。

为了sh!ts&#39; n&#39;咯咯笑,如果你被一根绳子卡住了 - 如果你可以更改分隔符 - 你可以这样做,我想:

  1. 使用indexOf()查找字符串中子字符串的第一个匹配位置,您需要使用正则表达式来匹配由分隔符char或字符串开头分隔的子字符串到分隔符char,或从分隔符char到字符串末尾没有中间分隔符字符。如果需要,我可以为此提出正则表达式。这还不知道列表,但我们知道它在字符串中的位置。
  2. 将原始字符串的子字符串从开头带到返回的位置indexOf()
  3. 使用split(),分隔分隔符
  4. 随后数组的长度将是匹配所在的原始list中的位置。
  5. 但是我强调你应该那样做。从一开始就使用数组而不是字符串。

答案 2 :(得分:2)

您可以将indexOf.toLowerCase()

结合使用
var list = '"Smith, John" , "Doe, Jane" , "etc..."';
if(list.toLowerCase().indexOf('"Smith, John"'))

如果您需要精确匹配,例如“Smith”存在时的“Smith”,只需使用分隔符填充字符串即可。例如,假设您的分隔符是分号(因为您的字符串中有逗号),请填充字符串的左侧和右侧,如下所示:

";Smith, John;Doe, Jane;"

同时填充搜索值,因此如果您正在寻找史密斯,则该值将变为:

";Smith;"

.toLowerCase().indexOf()将返回-1(未找到)。但是";Smith, John;"会返回0