2016-09-19 34 views
2

としてテキストファイルのデータを渡すこのフィドルを確認してください:https://jsfiddle.net/dp0y4hrw/16/Javascriptを、外部のテキストファイルを読み込み、パラメータ

は、これは文字列の配列で最長の複合語を見つけるために、JSです。

配列の代わりに、このプログラムは100,000行以上のテキストからなるローカルのtxtファイルを読みたいと思っています。次に、最長の複合語を見つけます。各行には1つの単語があります。

私はFileReaderを使用してデータを取得しようとしました。私は正しくデータを渡すことができましたが、 'addPrefix'と 'findPrefixes'の間の共有変数に問題がありました。

私はまた、非同期動作を説明するために、約束を使用してみました:

function readFile(event) { 
    var file = event.target.files[0]; 

    if (file) { 
    new Promise(function(resolve, reject) {  
     var reader = new FileReader();  
     reader.onload = function (evt) {  
     resolve(evt.target.result);  
     };  

     reader.readAsText(file);  
     reader.onerror = reject; 
    })  

    .then(findLongestWord) 
    .catch(function(err) {  
     console.log(err) 
    }); 
    } 
} 

document.getElementById('file').addEventListener('change', readFile, false); 

function findLongestWord(data) { 
... 

これはまだ私に問題を与えます。この状況でコンテンツを正しく処理できるように、ファイルを読み取る最良の方法は何ですか?

EDIT:

// adds word as a prefix 
var addPrefix = function (word) { 
    var i = 0; 
    var current = prefixes; 
    var char; 

    while (char = word[i++]) { 
    if (!current[char]) { 
     current[char] = {}; 
    } 
     current = current[char];  
    } 
    current.word = true; 
    return current.word; //RETURNING CURRENT WORD HERE 
}; 

// Finds the longest prefix we can make using the word. 
var findPrefixes = function (word) { 
    var prefix = ''; 
    var current = prefixes; 
    var found = []; 
    var i = 0; 
    var char; 

    while (char = word[i++]) { 
    if (!current[char]) { 
     break; 
    } 
    // Move to the next character and add to the prefix. 
    current = current[char]; 
    prefix += char; 

    if(current.word) 
    { 
     found.push(prefix); 
    } 
    } 
    return found; 
}; 

//for each word in list, add to prefix 
list.forEach(function (word) { 
    var prefix; 

// If we can find a closest possible word, it may be possible to create a 
// compound word - but we won't be able to check until we reach the end. 
if ((prefix = findPrefixes(addPrefix())) && prefix.length) { //FINDPREFIXES USING ADDPREFIX HERE 
    prefixMatch.push([ word, prefix ]); 

} 

// Insert the word into the prefix tree. 
addPrefix(word); 
}); 

EDIT 2:これは、入力されたテキストファイルの例です:

cat 
cats 
catsdogcats 
dog 
dogcatsdog 
hippopotamuses 
rat 
ratcatdogcat 
catratdograt 
dogcatscats 

期待される結果は次のとおりです。最長:ratcatdogcat、catratdograt ...第二最長:catsdogcats、dogcatscats。複合語の..number:5

+0

何の問題あなたは '質問でjavascript'とリンクjsfiddleを持っている前の項目にマッチ? – guest271314

+0

@ guest271314問題は、 'readFile(event)'を通して外部のテキストファイルのデータを読み込みたいのですが、そのように実装すると、 'current.word' object.keyは 'addPrefix'と' findPrefixes'。機能が動作しません。 – RJK

+0

_ "'current.word' object.keyはaddPrefixとfindPrefixesの間で共有されません" - どの関数を最初に呼び出す必要がありますか?第2の関数に渡されるべき期待されるパラメータと呼ばれるべき第1の関数の期待される結果値は何ですか?第2の関数の期待される戻り値はどれくらいですか? – guest271314

答えて

2

使用RegExp/\w+/g

\wアンダースコアを含む基本ラテンアルファベットの の任意の英数字に一致します。

x+は、x 1回以上

var list = data.match(/\w+/g); 
関連する問題