2012-07-07 14 views
5

私はColdFusionのリストによって腐敗してしまっており、カンマで区切られたリストがJavascriptで表示される状況で実行されています。 listFindNoCase('string','list')と同等のものがありますか、それともJavascriptでそれを実装する方法がありますか?JavascriptでColdFusionのlistFindNoCase関数を最も速く実装する方法は?

ああ、カンマでリスト項目を処理することができるはず、のような: (「スミス、ジョン」、「ドウ、ジェーン」、「等...」)

本当につまずきされたものです私のこと。

+0

あなたはあなたに*文字列*があると言っていますか?基本的には、CSV文字列ですか? JavaScript配列を持っていますか? – aquinas

+0

indexOfがすぐに使えるようになると、複雑なループや正規表現の文字列で私の頭を満たしていたことに恥ずかしい思いをします。私はindexOfが配列のためだけに働いていると仮定しました:P – eterps

+0

JSのRegExはむしろ単純だと思います。あなたが速く言うとき、それは速く走っていることを意味しますか、それとも速く書くことができますか? – Henry

答えて

2

あなたは「スミッソンが」存在する「スミス」、ちょうどパッドあなたの区切り文字と文字列のように完全に一致し、必要な場合には、.toLowerCase()

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

と組み合わせるindexOfを使用することができます。

";Smith, John;Doe, Jane;" 

またパッド検索値、そうあなた場合:たとえば、パッドあなたの文字列の左右にそうように、(あなたの文字列にカンマを持っているので)のは、あなたの区切り文字はセミコロンであるとしましょう-1を返します(見つからない)

";Smith;" 

.toLowerCase().indexOf():「再値になるだろう、スミスを探しています。 JListのの実装:しかし";Smith, John;"はFYI 0

+0

これは、例えば「スミス」も見つけます。 – gsnedders

+0

@gsnedders - はいです。 'Smith'が問題の場合、パディングを検索文字列に適用して完全一致検索にすることができます。 –

+0

これは実際にQとAの両方を正しく読んでいれば、実際に質問に答えられません。 listFind()ソートの呼び出しでは、文字列内の項目を見つけるだけではなく(この解決策が実行する)、* list *内のどの位置を返すか(OK Peter、 "区切り文字を含む文字列には、区切り記号の特別な意味、人間がリストをどのように考えているかのように、以下単に「リスト」と呼ばれる);-)。 EG:これを使用して "Doe、Jane"を検索すると、17(文字列内の位置)が返され、2(リスト内の位置)は返されません。 –

4

返します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); 
}, 
3

つの関連する観察ここで「カンマでリスト項目を処理することができるはず」というご要望を失敗します、が、 CFリスト自体がデリミタ文字もデータの一部であることをサポートしていないということです。 "Smith、John"、 "Doe、Jane"のサンプル "list"は4つの要素のカンマで区切られた "Smith"、 "John"、 "Doe"、 "Jane"のカンマ区切りのリストです。 listFindNoCase()は、実際にはCFの観点からの要件を満たしておらず、CFのネイティブもあなたの要件を満たしていないので、はCFのlistFindNoCase()のJS equivが必要です。カンマを埋め込んだ要素を処理するには、別のcharを区切り文字として使用する必要があります。

TBH、CFリストは、(上に挙げた理由のため)ちょっとしたゴミであり、非常に日常的な状況では本当に役に立ちます。 b)は、配列を介してとにかくうまく機能しません。 文字列ベースのリストを使用していないがパフォーマンスの第一歩になります(これはJSと同じようにCFにも当てはまります:CFの文字列ベースのリストはそうではありません)。すべての演奏家)。

私の最初の答えは次のようなものです:リストを使うことからあなたの要件を修正し、代わりに配列を使うべきだと思います。

これを念頭に置いて、データはどのようにJSに到達していますか?あなたは、文字列ベースのリストを使用してどのように立ち往生していますか?そうでない場合は、単純にしないでください。ソースデータが文字列ベースのリストの場合は、最初に配列に変換する位置にありますか? CFの観点からは、デリミタとデータの両方をカンマにすることはできません。また、クォートされたカンマがデータであり、引用符で囲まれていないカンマが区切り文字であることを識別するためのコードを書く作業を少し前から行っています。あなたはそのようなことに対処するためにCSV解析アルゴリズムを見てみるべきです。

ただし、デリミタ(パイプやセミコロン、データに表示されないものなど)を変更することができれば、それをCFの配列(listToArray() JS内でsplit()を実行することができます)。次に、他の人が言ったように、indexOf()を使うことができます。 SHの便宜上

TS「n」を笑い、あなたが文字列で立ち往生している場合、 - あなたは区切り文字を変更することができます提供 - あなたがこれを行うことが、私は思う:!見つける

  1. 使用indexOf()を文字列中の部分文字列の最初の一致の位置にある場合は、区切り文字で区切られた部分文字列、または文字列の先頭から区切り文字に、区切り文字から区切り文字にマッチする正規表現を使用する必要があります中間の区切り文字を持たない文字列の終わり。必要があれば正規表現を思いつくことができます。これはまだリストを意識しているわけではありませんが、文字列のどこにあるのかはわかります。
  2. 元の文字列の部分文字列を先頭から、返された位置indexOf()に移動します。
  3. その上で使用split()、デリミタで分離
  4. 続く配列の長さは、一致がにあった元のlist位置であろう。

しかし、私はあなたがではないをしなければならないことを強調します。最初から文字列の代わりに配列を使用します。

+1

最初の2つの段落は誤解を招く恐れがあります - ** CFにはリストがありません!**単純な区切り文字列を扱う関数を持っています。単純に区切られた文字列を処理する関数があります。 (それが必要なときには完全に便利です)。 –

+0

それは、ペントリーの深さを配管している、ピーター。そんなにあなたがなぜ迷惑をかけるのか不思議です。しかし、とにかく、何でも:私は誰もがここで議論されていることを解明することなく理解していると思います。乾杯。 –

+0

私はそれが誤解を招いているとコメントしました.-それがそうでないときに、 "リスト"がCFの中の特定のものであるというのは、よく誤解されています。 "CFリスト"を参照することは、SOのポイントが一般的に反対をするときに、その混乱に寄与する可能性があります。 –

関連する問題