2017-06-10 5 views
0

私はアルゴリズムのスキルを練習しようとしています。私は既にそこに書かれたアルゴリズムがあることを知っている、私はちょうど私自身でそれを試してみたいと私が得ることができる方法を参照してください。配列の繰り返し値を数えるJavaScript

INPUT:

arr1 = ['asd','ew','lol','asd'] 

予想される出力:

arr1 = ['asd', 'ew', 'lol', 'asd'] 
 
arr2 = [] 
 
results = {} 
 

 
function checkIfExists(word) { 
 
    if (arr2.length != 0) { 
 
    for (i = 0; i < arr2.length; i++) { 
 
     if (arr2[i] == word) { 
 
     results[word] += 1 
 
     } else { 
 
     arr2.push(word) 
 
     results[word] = 1 
 
     } 
 
    } 
 
    } else { 
 
    arr2.push(word) 
 
    results[word] = 1 
 
    } 
 
} 
 

 
for (i = 0; i < arr1.length; i++) { 
 
    checkIfExists(arr1[i]) 
 
} 
 
console.log(results)

実際の出力:

{ asd: 2, ew: 1, lol: 1 } 

これは私のコードです:

{ asd: 2, ew: 2 } 
+1

これはあなたのコードです。あなたが直面している問題は何ですか?質問は何ですか? – Manish

+1

最初の問題は、 'i'を宣言するために' var'を使用していないことです。これにより、両方のループが互いに干渉します。しかし、あなたがそれを修正しても、あなたは望みの結果を得られません。これまでにコードをデバッグするために何をしましたか? *具体的な質問がありますか? –

+2

@Manish意図はかなり明確であるはずです。期待される結果と実際の結果があります。タイトルは、コードが何をすべきかを明らかにする。これはStack Overflowが提供するほとんどの質問より多くの情報です。 – Xufox

答えて

2

あなたはグローバル変数としてiを使用するので、2つのループには使用しないでください。他の間違いは、結果配列に必要以上の数を追加するインクリメントアルゴリズムにあります。だから、それを試してみてください。

arr1 = ['asd','ew','lol','asd'] 
 
arr2 = [] 
 
results = {} 
 

 
function checkIfExists(word){ 
 
    if (arr2.length != 0){ 
 
    \t var exists = false; 
 
     for (var j = 0; j < arr2.length; j++){ 
 
     if(arr2[j] == word){ 
 
      results[word] += 1 
 
      exists = true; 
 
      break;   
 
     } 
 
     } 
 
     if(!exists) { 
 
      arr2.push(word) 
 
      results[word] = 1 
 
     } 
 
    }else{ 
 
     arr2.push(word) 
 
     results[word] = 1 
 
    } 
 
} 
 

 
for (var i = 0; i < arr1.length; i++) { 
 
    checkIfExists(arr1[i]) 
 
} 
 
console.log(results)

1

あなたが尋ねることを意図している場合があります、私はすぐに特定され3つの質問があります。

  1. 私のコードに問題がありますか?
    • 私はFelix Klings commentよりも、この優れた句ませんでした:

      最初の問題は、あなたがiを宣言するvarを使用していないということです。

    • おそらくarr2内のアイテムを検索することを意図したループもarr2を変更... たくさん!
  2. なぜコードが正しく出力されないのですか?あなたのコードは実際にはというの論理を出力しています。私は、表現しているロジックが表現しようとしていたロジックと一致しないという問題があると考えています。これは珍しいことではありません
  3. コードを修正するにはどうすればよいですか?
    • ループのイディオムをfor (i = ...)からfor (var i = ...)に変更することから始めます。
    • の目的について考えてみましょう。ループです。 arr2内にアイテムを配置する予定の場合は、arr2を変更する必要はありません。おそらくループは必要ないでしょう。
      1. ループ全体の代わりに、おそらくArray.prototype.indexOfまたはArray.prototype.includesを使用できます。
      2. おそらく、関数全体の代わりにfunction checkIfExists(word) { results[word] = arr1.filter(function(w) { return w === word; }).length; }を使用できます。
      3. 機能を設計する際にあなたには、いくつかのより高いレベルの意識を使用することができますように思えるので、おそらくこのコードの要素のいくつかの周りにあなたの頭をラップしようとするのは良い考えかもしれません:

var arr1 = ['asd','ew','lol','asd']; 
var result = arr1.reduce(function(result, w) { result[w] = result[w] || 0; 
               result[w]++; 
               return result;    }, {})); 
console.log(result); 
関連する問題