2017-07-16 58 views
0

我編寫了我的代碼來搜索關鍵字字符串並提取所需的數據,但是當我嘗試使用名爲sort,title和artist的數組中的關鍵字進行搜索時遇到問題。當我這樣做時,我得到一個關於潛在無限循環的錯誤。搜索數組的問題

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用於在節點之間進行通信。

回答

3

的問題是,你在你的幾個循環的這樣做:

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

...,你應該是這樣的,而不是做:

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

不使用let,變量i實際上是全球性的。每次你進入一個新的循環時,它都被重置爲0,所以它永遠無法增加,這就造成了無限循環。


作爲一個側面說明,你還會注意到sortreg時,它的上線98

+0

感謝您使用的是不確定的!當指令使用「classifier by」而不是「sort by」時,我也有問題。當我這樣做時,此代碼不會正確剪切查詢。我認爲這是循環中的問題,但我整天坐着,找不到解決方案 – Gnex