如何优化我的算法以使用子字符串进行搜索?

时间:2018-08-29 12:02:49

标签: javascript arrays string algorithm object

search: (query) => {
  const websites = cloneDeep(this.state.websites);
  let results = [];
  websites.forEach(object => {
    let isResult = false;
    const searchIn = ["code", "link", "offline", "online"];
    for(let prop = 0; prop < 4; prop++) {
      if(isResult) break; 
      const propVal = object[searchIn[prop]];
      if(typeof propVal === "string" && propVal !== "undefined") {
        if(propVal.toLowerCase().indexOf(query.toLowerCase()) !== -1) {
          isResult = true;              }
      }
    }
    if(isResult) results.push(object);
  });
}

p.s。我有一个对象数组。我需要检查每个对象的四个属性中是否至少有一个匹配。 “查询” =子字符串。

1 个答案:

答案 0 :(得分:1)

您正在使事情复杂化,方法是使用forEach遍历对象,然后迭代所有object键以检查它是否为搜索到的属性之一,并且其值是否包含搜索了query字符串。

您的函数没有返回任何东西,因为您只是尝试填充results数组而不返回它。

解决方案:

您可以简单地使用 Array#filter() method 过滤websites数组,然后在其中使用 Array#some() method遍历searchIn属性数组,并检查每个object的相对属性以及它们的值是否包含搜索到的query字符串。

这应该是您的代码:

const searchIn = ["code", "link", "offline", "online"];

search: (query) => {
  query = query.toLowerCase()
  websites.filter(o => searchIn.some(k => o[k] && typeof o[k] === "string" && o[k].toLowerCase().indexOf(query) > -1));
}