2017-07-16 8 views
0

キーワードを検索して必要なデータを抽出するコードを作成しましたが、ソート、タイトル、アーティストという名前の配列でキーワードを検索しようとすると問題が発生します。私がそれをやっているとき、私は潜在的な無限ループに関するエラーを取得します。コードの配列の検索に関する問題

var type = ['track','tracks','song','songs','album','albums']; 
var artist = ['created by', 'made by']; 
var genre = ['genre']; 
var limit = ['set limit']; 
var title = ['title','name']; 
var sort = ['sort by', 'classificate by', 'separate by']; 
var sortBy = ['popularity']; 

// function changeWordsToNumbers(words) { 
//   if (msg.numbers[words]) 
//    return msg.numbers[words]; 
// } 

function searchForIndex(instruction, keywords) { 
    for (i = 0; i < keywords.length; i++) { 
    let search = instruction.search(keywords[i]); 
    if (search) 
     return search; 
    } 
    return false; 
} 


function getSearchResult(wanted) { 
    var searchResult = { 
      artist : searchForIndex(wanted, artist), 
      genre : searchForIndex(wanted, genre), 
      limit : searchForIndex(wanted, limit), 
      type : searchForIndex(wanted, type), 
      title : searchForIndex(wanted, title), 
      sort : searchForIndex(wanted, sort), 
      sortBy : searchForIndex(wanted, sortBy) 
     }; 
    return searchResult; 
} 

function removeJunkKeyword(searchResult,instruction) { 
    for(var property in searchResult) { 
     if(searchResult.hasOwnProperty(property)) { 
      if(searchResult[property] != - 1) { 
        instruction = instruction.slice(0, searchResult[property] - 1); 
      } 
     } 
    } 
    return instruction; 
} 

function checkExist(searchResult) { 
    for(var property in searchResult) { 
     if(searchResult.hasOwnProperty(property)) { 
      if(searchResult[property] != -1) 
       return false; 
     } 
    } 
    return true; 
} 

function findAndCleanQuery(instruction, keywords) { 
     var exist = instruction.search(keywords); 
     var result = instruction.slice(exist + keywords.length + 1, instruction.length); 
     var searchResult = getSearchResult(result); 
     if (exist != -1) { 
      if (checkExist(searchResult)) { 
       return result; 
      } else { 
       result = removeJunkKeyword(searchResult,result); 
       return result; 
      }  
     } 
    return false; 
} 

function searchFor(instruction, keywords) { 
    for (i = 0; i < keywords.length; i++) { 
    let result = findAndCleanQuery(instruction,keywords[i]); 
    if (result) 
     return result; 
    } 
    return false; 
} 

function searchForType(instruction) { 
    for (i = 0; i < type.length; i++) { 
     let search = instruction.search(type[i]) 
     if(search) 
      return type[i]; 
    } 
    return false; 

} 

function searchForKeywords(instruction) { 
    msg.artist = searchFor(instruction, artist); 
    msg.type = searchForType(instruction, type); 
    msg.genre = searchFor(instruction, genre); 
    msg.limit = searchFor(instruction, limit); 
    msg.title = searchFor(instruction, title); 
    msg.sort = searchFor(instruction, sortreg); 
} 
var msg = {} 
msg.instruction = 'Search for me'; 
searchForKeywords(msg.instruction); 
console.log(msg.artist); 
console.log(msg.type); 
console.log(msg.genre); 
console.log(msg.limit); 
console.log(msg.title); 
console.log(msg.sort); 

リンク:https://repl.it/J4Mc/9

PS。オブジェクトmsgはノード間で通信するためにnode-redによって使用されます。 、letを使用しない

for (let i = 0; i < keywords.length; i++) { 

変数:

for (i = 0; i < keywords.length; i++) { 

...あなたはこの代わりにやるべきこと:

答えて

3

問題は、あなたのループのいくつかでこれをやっているということですiは実質的にグローバルです。新しいループに入るたびに0にリセットされるため、決して増やすことができず、無限ループが作成されました。それは

+0

ありがとうございライン98に使われているとき、注意点として、あなたもsortregに気付くでしょう


は定義されていません!私は命令が「分類」ではなく「分類」で使用するときにも問題があります。私がこれを行うと、このコードはカットクエリを修正しません。私はそれがループの問題だと思うが、私は一日中座っているし、解決策を見つけることができない – Gnex