5

我已经被 ColdFusion 的列表宠坏了,并且遇到过一两种情况,即在 Javascript 中出现逗号分隔的列表。是否有等效的listFindNoCase('string','list')或高性能的方式在 Javascript 中实现它?

哦,它应该能够处理带有逗号的列表项,例如:( "Smith, John" , "Doe, Jane" , "etc..." )

这才是真正让我绊倒的地方。

4

3 回答 3

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);
},
于 2012-07-07T01:46:44.313 回答
3

这里的一个相关观察是 CF 列表本身不支持分隔符 char 也是数据的一部分。'"Smith, John", "Doe, Jane"' 的示例“列表”是 '"Smith', 'John"', '"Doe', 'Jane"' 的元素逗号分隔列表。为了在这里满足您的要求,您不需要CF 的 JS 等价物listFindNoCase(),因为listFindNoCase()从 CF 的角度来看实际上并不能满足您的要求,而 CF 的原生功能也没有。要处理嵌入逗号的元素,您需要使用不同的字符作为分隔符。

TBH、CF 列表有点垃圾(出于上述原因),因为它们仅在非常平凡的情况下才真正有用,a) 不经常出现;b) 无论如何都不能通过数组更好地服务。在这里要进行的一个观察是您在这里询问一个高性能的解决方案:不使用基于字符串的列表将是高性能的第一步(这同样适用于 CF 和 JS:CF 的基于字符串的列表根本不是高性能)。

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

考虑到这一点,数据是如何到达 JS 的?您是否对使用基于字符串的列表感到困惑?如果不是:干脆不要。如果您的源数据是基于字符串的列表,您是否可以先将其转换为数组?正如我之前提到的,您的示例列表的“模式”遇到了麻烦:从 CF 的角度来看,您不能将逗号既作为分隔符又作为数据。在编写代码之前,您确实需要做一些工作来识别带引号的逗号是数据,而未带引号的逗号是分隔符。你应该看看 CSV 解析算法来处理这类事情。

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

为了嘘!

  1. 用于indexOf()查找字符串中子字符串的第一个匹配项的位置,您将需要使用正则表达式来匹配由分隔符字符分隔的子字符串,或者从字符串的开头到分隔符字符,或者从分隔符字符到字符串的末尾,没有中间分隔符字符。如果需要,我可以为此提出正则表达式。这还不是列表感知的,但我们知道它在字符串中的位置。
  2. 取原始字符串的一个子字符串从开始到indexOf()返回的位置。
  3. 使用split()它,在分隔符上拆分
  4. 随后的数组的长度将是list匹配在原始数组中的位置。

但是我强调你不应该那样做。从一开始就使用数组而不是字符串。

于 2012-07-07T07:25:48.153 回答
2

您可以indexOf结合使用.toLowerCase()

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

如果您需要完全匹配,例如存在“Smithson”时的“Smith”,只需使用分隔符填充字符串。例如,假设您的分隔符是分号(因为您的字符串中有逗号),请像这样填充字符串的左侧和右侧:

";Smith, John;Doe, Jane;"

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

";Smith;"

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

于 2012-07-07T00:32:48.447 回答