Как я могу оптимизировать свой алгоритм поиска по подстроке? - PullRequest
0 голосов
/ 29 августа 2018
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 голосов
/ 29 августа 2018

Вы слишком усложняете ситуацию, используя forEach для циклического перебора объектов, а затем перебирая все ключи object, чтобы проверить, является ли это одним из искомых свойств и содержит ли его значение искомый query строка.

Кстати, ваша функция ничего не возвращала, потому что вы только пытались заполнить массив results, не возвращая его.

Решение:

Вы можете просто использовать Array#filter() метод для фильтрации массива websites, где вы перебираете массив свойств searchIn с Array#some() method и проверьте для каждого 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...