2016-10-28 4 views
-2

私はjavascript配列のマッチングに新しいです。javascript配列が一意の結果を表示するために一致します

私は2つの配列を持っています。コンテンツの要素の11

txtfilename=['txt1','txt6','txt6','txt6','txt7','txt7','txt8','txt9','txt9','txt9','txt9'] 
content=['apple from one','six trees','cats','happy dogs','healthy fruit','good job','ask question','check safety','stay in the house','good results','happy holiday'] 

実際には、txtfilenameの要素の同じ位置が一致している同一の位置:各配列要素の同じ数を有しています。

たとえば、txtfilenameの2番目の要素がコンテンツの2番目の要素と一致しています。

ただし、txtfilenameには重複した要素があり、コンテンツの要素は一意です。

私はこれらの2つの配列を一致させるという問題があります。 私は以下のように、これらの2つの配列を表示したい:

txtfilename: txt1 
content: apple from one 

txtfilename:txt6 
content:'six trees','cats','happy dogs' 

txtfilename:txt7 
content:'healthy fruit','good job' 

txtfilename:txt8 
content:'ask question' 

txtfilename:txt9 
content:'check safety','stay in the house','good results','happy holiday' 
+3

(psst ... javaはjavascriptではありません) – evolutionxbox

+3

実際にJavaまたはJavascriptを使用していますか?あなたは両方のタグを付けました – khelwood

+0

私はそれを両方使用しています。もっと焦点を合わせるjavascript – bob90937

答えて

3
//Initialising arrays 
    String[] txtfilename = new String[] {"txt1", "txt6", "txt6", "txt6", "txt7", "txt7", "txt8", 
      "txt9", "txt9", "txt9", "txt9"}; 

    String[] content = new String[] {"apple from one", "six trees", "cats", "happy dogs", 
      "healthy fruit", "good job", "ask question", "check safety", "stay in the house", 
      "good results", "happy holiday"}; 

    //creating a map 
    Map<String, String> fileNameWithContents = new HashMap<>(); 

    //iterating through the array 
    for (int i = 0; i < txtfilename.length; i++) { 

     //check whether the map contains the txtfilename 
     if (fileNameWithContents.containsKey(txtfilename[i])) { 

      //appending the new content to the existing content in map 
      //Eg: txt6, txt7 and txt9 
      StringBuilder val = new StringBuilder(fileNameWithContents.get(txtfilename[i])); 
      val.append(", "); 
      val.append(content[i]); 
      fileNameWithContents.put(txtfilename[i], val.toString()); 
     } else { 
      //adding filename and content to map 
      fileNameWithContents.put(txtfilename[i], content[i]); 
     } 

    } 

    // Printing contents of map 
    for (Entry<String, String> e : fileNameWithContents.entrySet()) { 
     System.out.println("txtfilename: " + e.getKey()); 
     System.out.println("txtfilename: " + e.getValue()); 
     System.out.println(); 
    } 

これは、あなたがたMapReduceアルゴリズムを実装することができ、JavaScriptで仕事

+1

少し説明しますか? OPは実際に何かを学びたいと思うかもしれません... –

+1

私はファイル名を保存するためにhashMapを使用しています(キーはファイル名で内容は値です)。 HashMapはその中に重複するキーを持っていません。 私はファイル名配列を反復し、対応するファイル名に対してコンテストを格納しています。トリッキーな部分はファイル名を複製することができます。マップに選択されたキーのデータがあるかどうか。値がある場合はマップから値に新しい値を追加します。 助けて欲しいです.. – Jobin

+0

お返事を編集してコメントを追加しただけでは、@Jobinさん、ありがとうございます。 :-) –

0

だろう:

var result = txtfilename.map((item, index) => ({"txtfilename": item, "content": content[index]})); 
var shift = 0; 
txtfilename.forEach((item, index, arr) => { 
    if (index < arr.length - 1 && item === arr[index+1]) 
    { 
     result[index + shift].content += ", " + content[index+1]; 
     result.splice(index + 1 + shift, 1); 
     shift --; 
    } 
}); 
console.log(result); 
// [ { txtfilename: 'txt1', content: 'apple from one' }, 
// { txtfilename: 'txt6', content: 'six trees, cats, happy dogs' }, 
// { txtfilename: 'txt7', content: 'healthy fruit, good job' }, 
// { txtfilename: 'txt8', content: 'ask question' }, 
// { txtfilename: 'txt9', content: 'check safety, stay in the house, good results, happy holiday' } ] 

編集:
をまず、オブジェクトの配列を取得するために、テキストファイル名とコンテンツをマップします。各オブジェクトにはtxtfilenameとcontentというプロパティがあります。
次に、配列はtxtfilenameでソートされているので、各オブジェクトをそのneighbourgと比較します。両方のオブジェクトが同じキー(textfilenameプロパティ)を持っている場合、最初のオブジェクトに2つの文字列(content proprety)を連結し、冗長化された2番目のオブジェクトを削除します。

+0

いくつかの説明がありますか? – bob90937

+0

私はちょうど説明を提供するために編集しました。それが十分明確でないかどうかお気軽にお尋ねください。あなたは答えられるでしょう –

関連する問題