2017-03-24 3 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 
} 

それはAさんの1を数えていません。私は間違って何をしていますか?オブジェクトに関連するものが見つかりませんでした。

ありがとうございます!

+0

:いくつかのより多くの最近の機能と組み合わせることで、それはに減らすことができますか?私はここにあなたが近づいていることを理解していない –

+0

あなたのコードを歩いてください。それを通して話してください。それをラバーアヒル、またはあなたの隣に座っている誰かに説明してください。デバッガでトレースします。あなたがコンピュータであるかのように紙の上でそれを実行します。 –

答えて

0

あなたのコード投稿として代わりにあなたがreturn wordsを持っている必要がありreturn wordCountの、実行されません。

なぜを0に初期化するのか分かりません。-1に要素がないため、追加のループが作成されます。

リスト内の各単語を他のすべての単語と比較していて、一致しない場合は、そのカウントを1に設定するため、ロジックが分解されます。一致した場合はカウントを増やします。

しかし、次の単語が一致しないときは、それ以前の値であってもその値は1にリセットされます。 「質問」という単語は最後の単語であり、リセットする機会がないため2の値を持ちます。

ロジックが根本的に壊れているため、新しいアルゴリズムが必要です。より一般的な方法は、単語を1回移動して、各単語が遭遇すると、単語オブジェクトにまだない場合は、それを追加して値を1に設定します。

など。

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); 

言葉オブジェクトが継承されたプロパティを持っていないよう:代替が使用することです。なぜあなたは、ループのための2を使用している

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

問題が複雑化しています。まず、すべての単語に1つのループが必要です。あなたが紙でこれを自分でやっていたかどうかについて考えてみましょう。文章を一度だけ読んで、各手紙のインスタンス数を数えます。

ループスルーするときに、あなたが集計テーブル(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

次の2つのループでこれを過度に複雑しているようです。単語の配列を1回だけループする必要があります。 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

関連する問題