javascript - 搜索数组时出现问题

标签 javascript arrays string node-red

我编写了代码来搜索字符串中的关键字并提取所需的数据,但是当我尝试使用名为:排序、标题和艺术家的数组中的关键字进行搜索时,我遇到了问题。当我这样做时,我收到有关潜在无限循环的错误。

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。 Node-red 使用 msg 对象在节点之间进行通信。

最佳答案

问题是您在多个循环中执行此操作:

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

...您应该在哪里执行此操作:

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

如果不使用let,变量i实际上是全局的。每次进入新循环时,它都会重置为 0,因此它永远无法增加,从而创建了无限循环。

<小时/>

顺便说一句,您还会注意到 sortreg 在第 98 行使用时未定义。

关于javascript - 搜索数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134158/

相关文章:

javascript - 升级 jQuery 后出现类型错误

javascript - 如何解释映射到对象类型文字的接口(interface)字符串属性周围的括号?

c++ - 为什么 C++ 中有数组时必须完全重写文件?

c++ - 使用指针处理字符串

javascript - getJSON更新进度条

javascript - jQuery 验证插件 - 焦点事件与键/鼠标事件不一致

ruby - 从 Ruby 哈希数组中提取数据

c++ - 未声明的标识符/数组

C# 在列表框中查找特定文本

python - R 中是否有类似于 Python 的 % 的字符串格式化运算符?