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

ここでの関連する観察の1つは、CFリスト自体がデータの一部である区切り文字charをサポートしていないことです。'"Smith、John"、 "Doe、Jane"'のサンプル"list"は、'" Smith'、'John "'、'" Doe'、'Jane"'の4要素のコンマ区切りリストです。ここで要件を満たすために、CFのJSと同等のものは必要ありませlistFindNoCase()ん。これは、CFの観点からは実際には要件を満たしていないためlistFindNoCase()であり、CFに固有のものは何も行いません。カンマが埋め込まれている要素を処理するには、区切り文字として別​​の文字を使用する必要があります。

TBH、CFリストは、(上記の理由で)少しごみです。これは、非常にありふれた状況でのみ実際に役立つためです。b)とにかくアレイを介して提供する方が良いわけではありません。ここで行うべき1つの観察は、ここでパフォーマンスの高いソリューションについて質問していることです。文字列ベースのリストを使用しないことが、パフォーマンスを向上させるための最初のステップになります(これは、JSの場合と同様にCFにも当てはまります。CFの文字列ベースのリストはまったくありません。パフォーマンス)。

したがって、ここでの最初の答えは次のようになります。リストを使用せずに要件を修正し、代わりに配列を使用することを検討する必要があると思います。

それを念頭に置いて、データはどのようにJSに到達しますか?文字列ベースのリストを使用することに固執していますか?そうでない場合:単にしないでください。ソースデータが文字列ベースのリストである場合、最初にそれを配列に変換する立場にありますか?前に述べたように、サンプルリストの「スキーマ」に問題があります。CFの観点からは、区切り文字とデータの両方をカンマにすることはできません。また、引用符で囲まれたコンマがデータであり、引用符で囲まれていないコンマが区切り文字であることを識別するためのコードを作成する前に、少し作業が必要です。そのようなことを処理するには、CSV解析アルゴリズムを見て回る必要があります。

ただし、区切り文字を変更できる場合(パイプ、セミコロン、またはデータに表示されないものなど)、それを配列(CFのlistToArray()、またはsplit())に変換するのは簡単です。 JSで)。次に、他の人が言っているように、indexOf()を使用できます。

sh!ts'n'の笑い声のために、文字列でスタックしている場合(区切り文字を変更できる場合)、これを行うことができると思います。

  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を探している場合、値は次のようになります。

";Smith;"

.toLowerCase().indexOf()-1を返します(見つかりません)。しかし、";Smith, John;"0を返します

于 2012-07-07T00:32:48.447 に答える