2014-09-24 52 views
0

我試圖計算某些單詞出現在字符串中的次數。每次我運行它,我得到一個使用字符串中的搜索方法

未捕獲TypeErro:undefined是不是一個函數

我只是實際需要計算的時代「主要」每次出現的數量。

下面是我的代碼:

for(var i = 0; i < sortedarray.length; i++) 
    { 
     if(sortedarray.search("Multimedia") === true) 
     { 
      multimedia += 1; 
     } 
    } 
    console.log(multimedia); 

這裏是存儲在一維數組我的csv文件。

"NAME","MAJOR","CLASS STANDING","ENROLLMENT STATUS" 
"Smith, John A","Computer Science","Senior","E" 
"Johnson, Brenda B","Computer Science","Senior","E" 
"Green, Daisy L","Information Technology","Senior","E" 
"Wilson, Don A","Information Technology","Junior","W" 
"Brown, Jack J","Multimedia","Senior","E" 
"Schultz, Doug A","Network Administration","Junior","E" 
"Webber, Justin","Business Administration","Senior","E" 
"Alexander, Debbie B","Multimedia","Senior","E" 
"St. John, Susan G","Information Technology","Junior","D" 
"Finklestein, Harold W","Multimedia","Freshman","E" 
+0

如果有人需要更多的代碼,我可以編輯並放了更多。我只是想保持簡單。 – user4073939 2014-09-24 09:14:40

+1

沒有'Array.search'這樣的東西。 – Cerbrus 2014-09-24 09:15:19

+1

你有效的錯誤說'Array.prototype.search是未定義的'。你必須找到另一種方式來做你的搜索。 – phuzi 2014-09-24 09:15:46

回答

-1

.searchundefined並且不是陣列上的function

但存在於當前string你想檢查!只需在sortedarray[i]的陣列中選擇當前的string

修正你的代碼這樣的:

for(var i = 0; i < sortedarray.length; i++) 
{ 
    if(sortedarray[i].search("Multimedia") === true) 
    { 
     multimedia += 1; 
    } 
} 
console.log(multimedia); 
+0

因此,這應該搜索數組的元素,並找到我正在尋找的單詞?謝謝。 – user4073939 2014-09-24 09:20:28

+0

'=== true'不是你想要的。看看['String.prototype.search()'](https://developer.mozilla)的返回值。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search)(與'indexOf'類似) – Cerbrus 2014-09-24 09:20:34

2

什麼你可能要做的是:

for(var i = 0; i < sortedarray.length; i++) 
{ 
    if(sortedarray[i].indexOf("Multimedia") !== -1) 
    { 
     multimedia++; 
    } 
} 
console.log(multimedia); 

我用indexOf因爲search是有點矯枉過正,如果你不使用正則表達式。

另外,我用++替換了+= 1。這幾乎是一樣的。

+1

downvoter是否在意解釋什麼是錯的?如果我犯了一個錯誤,我想從中吸取教訓。 – Cerbrus 2014-09-24 09:21:57

+0

我同意。 Upvoted您的答案:P – chris97ong 2014-09-24 09:22:27

1

這是一個更直接的解決方案。首先,你使用reduce算上所有的話,那麼你可以用點表示法訪問它們(或括號標記,如果你有一個字符串或動態值):

var words = ["NAME","MAJOR","CLASS STANDING","ENROLLMENT STATUS"...] 

var count = function(xs) { 
    return xs.reduce(function(acc, x) { 
    // If a word already appeared, increment count by one 
    // otherwise initialize count to one 
    acc[x] = ++acc[x] || 1 
    return acc 
    },{}) // an object to accumulate the results 
} 

var counted = count(words) 

// dot notation 
counted.Multimedia //=> 3 

// bracket notation 
counted['Information Technology'] //=> 3 
+0

對於明顯學習編程的人來說,方式太過於複雜。 – Cerbrus 2014-09-24 09:18:23

+0

所以這個東西現在過於複雜了?我想我們會回到'for'循環,哦,我的。 – elclanrs 2014-09-24 09:26:30

+0

這裏有一些半高級的概念,++在未定義的變量上,布爾操作不返回布爾值,減少函數。仍然是一個很好的解決方案,初學者可以從中學習。這不是太複雜,但我不會直接說它。不是被低估的理由。 – 2014-09-24 09:30:56

2

你需要每個字符串數組內搜索不到。到只有「大」一欄裏面進行搜索,您可以通過4開始在索引1和增量循環:

var multimedia = 0; 
for(var i = 1; i < sortedarray.length; i += 4) 
{ 
    if(sortedarray[i].indexOf("Multimedia") > -1) 
    { 
     multimedia += 1; 
    } 
} 
console.log(multimedia); 
0

我不正是你需要這個還是不知道。但我認爲它能夠更好地計數單迴路的每個單詞出現這樣的:

var occurencesOfWords = {}; 

for(var i = 0; i < sortedarray.length; i++) 
{ 
    var noOfOccurences = (occurencesOfWords[sortedarray[i]]==undefined? 
          1 : ++occurencesOfWords[sortedarray[i]]); 

    occurencesOfWords[sortedarray[i]] = noOfOccurences; 
} 
console.log(JSON.stringify(occurencesOfWords)); 

所以你會得到這樣的事情到底:

{"Multimedia":3,"XYZ":2}