2017-03-24 29 views
-1

我試圖建立一個計算字符串中的獨特單詞,並將它們分配到的對象的鍵/值對的程序。以下是我迄今爲止:函數創建一個對象來算,從一個獨特的串詞在JavaScript

function count(sentence) { 
    var list = sentence.split(' '); 
    var words = {}; 
    for(var i = 0; i < list.length; i++) { 
    for(var j = -1; j < list.length; j++) { 
     if(list[i] !== list[j]) { 
     words[list[i]] = 1; 
     } else { 
     words[list[i]] += 1; 
     } 
    } 
    } 
    return wordCount; 
} 
var display = count('ask a question get a question'); 
console.log(display); 

控制檯是給我:

[object Object] { 
    a: 1, 
    ask: 1, 
    question: 2, 
    get: 1 
} 

這還不包括一的之一。我究竟做錯了什麼?無法找到與對象相關的任何內容。

謝謝!

+0

你爲什麼要使用2 for循環?我不明白你的方法在這裏 –

+0

遍歷你的代碼。通過它進行談話。向橡皮鴨或坐在你旁邊的人解釋一下。在調試器中跟蹤它。像在電腦上一樣在一張紙上執行它。 –

回答

0

你的代碼發佈不運行,而不是return wordCount你應該有return words

我不知道你爲什麼初始化Ĵ爲-1,它僅僅是創建一個額外的循環,因爲在-1沒有元素。

你的邏輯分解,因爲你是在列表中的每個字比較其他單詞,如果不匹配,設置其計數爲1。如果匹配,則增加計數。

但下一次的話不匹配,它的值重置爲1,即使是以前一些其他的價值。 「問題」一詞的值爲2,因爲這是最後一個詞,並且沒有機會重置。

你的邏輯是從根本上打破,因此需要一種新的算法。更常見的做法是走過去的話一次,在遇到每一個字,如果它不是已經在對象,添加它並將其值設置爲1。如果它的存在已經,增加數值。

E.g.

function count(sentence) { 
 
    var list = sentence.split(' '); 
 
    var words = {}; 
 
    for (var i = 0; i < list.length; i++) { 
 
    if (!(words.hasOwnProperty(list[i]))) { 
 
     words[list[i]] = 0; 
 
    } 
 
    ++words[list[i]]; 
 
    } 
 
    return words; 
 
} 
 
var display = count('ask a question get a question'); 
 
console.log(display);

這將使用hasOwnProperty測試,你可能會遇到一個詞是對象的標準屬性。一個替代方案是使用:

var words = Object.create(null); 

使得詞語對象沒有繼承屬性。一些較新的功能相結合,它可以簡化爲:

function count(sentence) { 
 
    return sentence.split(' ').reduce(function(acc, word) { 
 
    acc[word]? ++acc[word] : acc[word] = 1; 
 
    return acc; 
 
    }, Object.create(null)); 
 
} 
 
var display = count('ask a question get a question'); 
 
console.log(display);

0

您正在過度複雜的問題。對於初學者來說,你只需要一個循環遍歷所有單詞。考慮一下,如果你是在紙上做這件事,那麼你只能通過一次這個句子來計算每個字母有多少個實例。

如您遍歷,你會檢查,看看是否已經通過諮詢您的理貨表(words.hasOwnProperty)遇到這個詞。

一個更好的解決辦法是:

function count(sentence) { 
    var list = sentence.split(' '); 
    var words = {}; 
    for(var i = 0; i < list.length; i++) { 
     var word = list[i]; 
     if (words.hasOwnProperty(word)) { 
      words[word]++; 
     } else { 
      words[word] = 1; 
     } 
    } 
    return words; 
} 

var display = count('ask a question get a question'); 
console.log(display); 

這給:

{ 
    "ask":1, 
    "a":2, 
    "question":2, 
    "get":1 
} 
+0

這並不回答這個問題:「*我在做什麼錯?*」 – RobG

0

你似乎有兩個循環來這過於複雜。你只需要循環一次單詞。如果您的words對象已有該密鑰,請將其增加。如果沒有,請將其設置爲1

function count(sentence) { 
    var list = sentence.split(' '); 
    var words = {}; 
    for (var i = 0; i < list.length; i++) { 
     if(words[list[i]]) { 
     words[list[i]]++; 
     } else { 
     words[list[i]] = 1; 
     } 
    } 
    return words; 
    } 
    var display = count('ask a question get a question'); 
    console.log(display); 
+0

答案時間太近了 – JosephGarrone

相關問題