2016-10-12 13 views
0

初心者プログラマー。私は、入力テキストを取って、単語を単一の配列項目に分割し、各単語の合計数を出力に列挙する課題に苦労しています。入力の分割はうまくいきますが、重複した項目の配列をチェックしてその項目を削除する必要があります(その項目を一意に保つ必要があります)。配列内の同一項目の削除

アイデアは、単語だけで構成された配列と、数を記録する配列を作ることでした。よりシンプルなアプローチを使用するためのヒントを受け取ってうれしいです。

はい、私はこの問題の解決策がいくつかあることを知っていますが、関数を使用してこの特定のコードを修正する方法を理解できていません。

function gen() 
{ 
    var arr = []; 
    var counter = []; 
    var str = document.getElementById("inpTxt").value; 
    str.toString(); 
    str = str.split(" "); 

    for(var i = 0; i < str.length; i++) 
    { 
     arr.push(str[i]);         
     counter[i]++; //ignore that this array hasnt been properly declared yet, Im trying to make this equal length of arr with default value 0 
     //tried nested loop here for making comparison, didnt work 

     document.getElementById("print").innerHTML += "Total number of the word \"" + arr[i] + "\": " + counter[i] + " <br />"; 
    } 
} 
+0

配列の代わりに[オブジェクト](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)を使用してください – Andreas

答えて

0

indexOf配列のメソッドを試して、配列に文字列があるかどうかを確認してください。

function gen() 
    { 
     var arr = []; 
     var counter = []; 
     var str = document.getElementById("inpTxt").value; 
     str.toString(); 
     str = str.split(" "); 

     for(var i=0; i < str.length; i++) 
     { 
      if(arr.indexOf(str)==-1){      
      arr.push(str[i]);         
      counter[i]++; //ignore that this array hasnt been properly declared yet, Im trying to make this equal length of arr with default value 0 
      } 
      //tried nested loop here for making comparison, didnt work 

      document.getElementById("print").innerHTML += "Total number of the word \"" + arr[i] + "\": " + counter[i] + " <br />"; 
     } 
    } 

PSは:そこに利用できる安価な方法があることを知ってくださいしかし、私はちょうど何でも私ができると助けしようとしています。

+0

私はstr変数を追加する必要がありますArrayOfメソッドを使用する前に、まず配列の実際の内容になるでしょうか?) – gr0nnsak

+0

もし配列が空であれば配列に値を見つけなければ-1を返しますが、[indexOf](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects)を読んでください。/String/indexOf)あなたがもっと知りたいのであれば、 – Siddharth

2

あなたはECMAScript2015(ES6)を使用している場合、あなたはSet構築することができます - 単一性を保証 - あなたの配列から:

var inputArray = [1, 1, 2, 3, 2, 4, 5, 5, 4, 1]; 
console.log(new Set(inputArray)) // displays Set { 1, 2, 3, 4, 5 } 

特定の要素は、以下の場合はそうでなければ、あなたは配列をループしてチェックすることができます自身の別の発生:我々は配列をループしているので

var inputArray = [1, 1, 2, 3, 2, 4, 5, 5, 4, 1]; 
// with ES6 : 
var result = inputArray.filter((element, index) => ! inputArray.slice(0, index).includes(element)); 
// without ES6 : 
result=[]; 
for (var i=0; i<inputArray.length; i++) { 
    var currentElement = inputArray[i]; 
    var previouslyFound = false; 
    for (var j=0; j<i && !previouslyFound; j++) { 
     previouslyFound = inputArray[i] == inputArray[j]; 
    } 
    if (!previouslyFound) result.push(currentElement); 
} 

しかし、最初の配列をunicizingせず発生をカウントするように高速になります:

var inputArray = [1, 1, 2, 3, 2, 4, 5, 5, 4, 1]; 
// with ES6 : 
var result = inputArray.reduce(function(map, element) { 
    map[element] = map.hasOwnProperty(element) ? map[element] + 1 : 1; 
    return map; 
}, {}); 
// without ES6 : 
var result = {}; 
for (var i=0; i<inputArray.length; i++) { 
    var currentElement = inputArray[i]; 
    if (result.hasOwnProperty(currentElement)) { 
     result[currentElement] = result[currentElement] + 1; 
    } else { 
     result[currentElement] = 1; 
    } 
} 
+1

は学習の質問であり、ゴルフの方法ではありませんでした。 –

+0

おっと、私は説明を十分に読まなかった。自分の答えの代わりに「最初から」を追加しますが、「セット」の使用はゴルフとはほとんど関係がありません。自家製の代替品より効率的であることも期待されています。 – Aaron

関連する問題