2012-07-07 78 views
5

我已經被ColdFusion的列表所迷惑,並且已經運行了一個或兩個使用Javascript顯示逗號分隔列表的情況。有沒有相當於listFindNoCase('string','list'),或在Javascript中實現它的表現方式?JavaScript中ColdFusion的listFindNoCase函數的最快實現是什麼?

哦,它應該能夠處理列表項之間用逗號,如: (「史密斯,約翰」,「李四,簡」,「等等」)

那什麼是真正跳閘我起來。

+0

你是說你有*字符串*就是這樣嗎?基本上,一個CSV字符串?或者你有JavaScript數組? – aquinas 2012-07-07 00:36:36

+0

當indexOf開箱即用時,我感到尷尬的是,我正在用複雜的循環和可能的正則表達式填充我的頭部!我只是假設indexOf只適用於數組:P – eterps 2012-07-07 00:45:34

+0

我認爲JS中的RegEx會相當簡單。當你說快,你的意思是跑得快,或者你可以寫一個快? – Henry 2012-07-07 01:35:31

回答

2

您可以使用indexOf.toLowerCase()

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

合併如果您需要完全匹配,像「史密斯」時,「史密森」的存在,只是墊與你的分隔符的字符串。例如,假設您的分隔符是一個分號(因爲你在你的字符串有逗號),墊你的字符串的左右兩側,像這樣:

";Smith, John;Doe, Jane;" 

而且墊搜索值,因此,如果您正在尋找史密斯,該值將成爲:

";Smith;" 

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

+0

儘管如此,它也會找到「Smith」。 – gsnedders 2012-07-07 00:46:50

+0

@gsnedders - 會的。如果'Smith'是個問題,則可以將填充應用於搜索字符串以使其成爲完全匹配搜索。 – 2012-07-07 01:03:50

+0

這實際上並沒有回答問題,如果我正確地閱讀它(Q和A,我的意思是)。一個listFind()類型的調用不只是找到字符串中的項目(這個解決方案就是這樣做的),它返回* list *中的哪個位置(OK Peter,「帶有分隔符的字符串,分隔符的特殊含義,有點像人類會考慮列表,以後簡稱爲「列表」;-)。 EG:如果您使用它來查找「Doe,Jane」,它將返回17(在字符串中的位置),而不是2(它在「列表」中的位置)。 – 2012-07-07 18:41:31

4

FYI: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); 
}, 
3

一個相關的觀察這裏CF列表本身不支持分隔符char也是數據的一部分。 「Smith,John」,「Doe,Jane」的樣本「列表」是四個 - 「Smith」,「John」,「Doe」,「Jane」的元素逗號分隔列表。爲了滿足你的要求,你在這裏你不要想要一個JS的equiv的CF的listFindNoCase(),因爲listFindNoCase()實際上不是從CF的角度來滿足你的要求,而CF本身沒有。要處理嵌入逗號的元素,您需要使用其他字符作爲分隔符。

TBH,CF列表有點垃圾(因爲上面提到的原因),因爲它們在非常普通的情況下才真正有用,它們a)不經常出現; b)無論如何都不能通過數組更好地服務。在這裏要做的一個觀察是你在這裏問一個高性能的解決方案:不使用基於字符串的列表將是性能的第一步(這同樣適用於CF,因爲它對JS:CF的基於字符串的列表不是在所有表演者)。

所以我的第一個答案是:我認爲你應該修改你的需求,而不是使用列表,而是用數組來代替。

考慮到這一點,數據如何到達JS?你是如何堅持使用基於字符串的列表?如果沒有:根本不。如果您的源數據是基於字符串的列表,您是否有能力首先將其轉換爲數組?正如我之前提到的,您遇到了示例列表的「模式」問題:從CF的角度來看,您不能使用逗號作爲分隔符和數據。在編寫代碼來確定引用逗號是數據,並且非引號逗號是分隔符之前,您確實有一些工作要做。你應該看看CSV解析算法來處理這類事情。但是,如果你可以改變分隔符(表示一個管道或分號或者不會出現在數據中的東西),那麼很容易把它變成一個數組(在CF中是listToArray(),而不是在數組中存在的數組)或JS中的split())。然後你可以像別人說的那樣使用indexOf()。 !

對於sh的緣故TS「N」笑聲,如果你堅持一個字符串 - 只要你可以改變分隔符 - 你可以做到這一點,我認爲:

  1. 使用indexOf()找到子字符串在字符串中第一次匹配的位置,您需要使用正則表達式來匹配由分隔符char或從字符串開頭到分隔符char或從分隔符char到沒有中間分隔符字符串的末尾。如果需要,我可以拿出這個正則表達式。這還不能列表,但我們知道它將在字符串中的位置。
  2. 將原始字符串的子字符串從開始位置返回到位置indexOf()
  3. 使用split()上,劈裂上定界符
  4. 隨後的陣列的長度將在原始list該比賽是在該位置。

但是我強調你應該不是那樣做。從一開始就使用數組而不是字符串。

+1

你的前兩段是誤導 - ** CF沒有列表!**它具有處理簡單定界字符串的函數,它們恰好使用單詞「list」來表示它們做什麼,但它們只是基本的字符串操作(並且在需要時是非常有用的)。 – 2012-07-07 09:57:09

+0

彼得,這正在探索一點兒的深度。我太想知道你爲什麼打擾了。但無論如何,無論如何:我認爲其他人可能在沒有澄清的情況下理解正在討論的內容。乾杯。 – 2012-07-07 10:09:43

+0

我評論是因爲這是誤導 - 這是一個常見的誤解,「清單」在CF中是一個特殊的事情,當它不是。談到「CF名單」有可能造成這種混淆,因爲SO的目的通常是做相反的事情。 – 2012-07-07 10:18:52

相關問題