2013-03-28 89 views
1

這一定很簡單,但我無法弄清楚如何計算一系列事物中的子串數量。 Underscore中的任何內容爲此我缺少?在Javascript或Underscore中,我可以計算一個數組中子字符串的多少個實例嗎?

var foo = ["fred", "ted", "medical", "car"] 

function howManySubstringsInArray(arr, word){ 
    var i = arr.length, 
    j = 0; 
    while (i) if (arr[--i].indexOf(word))++j; 
    return j; 
} 

howManySubstringsInArray(foo, 'ed') 
Output => 3 

這是行不通的。

+0

檢出:http://stackoverflow.com/questions/4009756/how-to-count-string-occurrence-in-string –

+2

它應該匹配一個字中的多個子字符串嗎? – loganfsmyth

+0

你應該使用'arr [ - i] .indexOf(word)!= -1' – jcubic

回答

6

假設你不關心重複匹配中每個數組元素,可以filter數組中找到匹配的元素:

注意:這是一個標準的ECMAScript 5函數,而不是從下劃線。在上面的鏈接中,舊版瀏覽器有一個墊片。

function howManySubstringsInArray(arr, word) { 
    return arr.filter(function(v) { 
     return v.indexOf(word) >= 0; 
    }).length; 
} 

嚴格地說,這是創建一個新的陣列是略有浪費,因爲我們所做的是計數的元素,但對於「小」列出都不會有問題。

無論如何,裸露的循環實際上工作得非常好 - 您只需確保循環結構正確,並且您實際上會看到.indexOf調用的結果。您現有的向後迭代,使循環條件更難跟蹤比他們需要:

function howManySubstringsInArray(arr, word) { 
    var i = 0, n = arr.length, count = 0; 
    for (; i < n; ++i) { 
     if (arr[i].indexOf(word) >= 0) { 
      ++count; 
     } 
    } 
    return count; 
} 
+0

這會錯過重複的字符串,例如「bedded」。 –

+0

@ T.J.Crowder所以OP的代碼 – Alnitak

+1

是的,但是OP在代碼中尋求幫助,因爲知道它是錯誤的。 –

3

你的while循環需要檢查實際的索引。

while (i) if (arr[--i].indexOf(word) !== -1) ++j; 

你也可以使用reduce以及這裏:

function howManySubstringsInArray(arr, word){ 
    return _.reduce(arr, function(count, val){ 
    return count + (val.indexOf(word) === -1 ? 0 : 1) 
    }, 0); 
} 
+0

這會錯過重複的同一個字符串,例如「bedded」。 –

+0

@ T.J.Crowder:雖然這個問題並沒有完全清楚...... – Jon

+1

好點的先生們。我不設想檢查同一元素中的重複,只要每個元素一次就可以。 –

-1
function howManySubstringsInArray(arr,str) 
{ 
var count=0; 
    $.each(arr,function(i,item)){ 
    if(item.indexOf(str)!=-1) 
    { 
     count ++; 
    } 
    }); 
return count; 
} 

變化$。每到了,如果你想。

+0

非常感謝Anh-我非常感謝你對此的幫助! –

相關問題