проблема с частичным совпадением indexof ()

#javascript #google-apps-script #indexof

#javascript #google-apps-script #indexof

Вопрос:

кодирование простого веб-сайта в Google App Script

есть электронная таблица в Google Sheet — 2 столбца — в 1-м есть существительные, а во 2-м описательные слова

что-то лежит в этом:

Столбец 1 — Столбец 2

стол — дерево

шарик — пластиковый

стул — металлический синий

мой код ищет ключевое слово во 2-м столбце и возвращает совпадение из 1-го столбца. он отлично работает, когда в столбце 2 есть одно слово, но не тогда, когда их больше … поэтому поиск «wood» возвращает таблицу, поиск «plastic» возвращает ball, но поиск «metal» ничего не возвращает, и то же самое для «blue»

есть идеи, как это решить?

  function FilterResults(keyword){
  
  //connect with spreadsheet
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("sheet1");
  var sheetData = ws.getRange(1,1,ws.getRange("A1").getDataRegion().getLastRow(),5).getValues();
  
  //create arrays of values from cells in each column   
   var Column1List = sheetData.map(function(r){return r[0]; });
   var Column2List = sheetData.map(function(r){return r[1]; });
   
   
   //make sure search tags are in string format
   var x = keyword.toString();
   
   //find 1st row(position) that has tag in it
   var position = Column2List.indexOf(x);
   
     if (position > -1){
   
   //if the search found a match return cell content according to row number
     return Column1List[position];
   }else{
     return "unavailable";
   } 

Комментарии:

1. Как вы Column2List выглядите в случае двух или более ключевых слов? Вы пробовали регистрировать это в консоли?

2. он содержит слова, разделенные только пробелом… журнал массива возвращает «дерево, пластик, металл синего цвета и т. Д. …»

Ответ №1:

Ваша проблема в строке var position = Column2List.indexOf(x); , indexOf возвращает точное совпадение, вы должны использовать findIndex и передать функцию для поиска по вашему ключевому слову:

 var position = Column2List.findIndex( s => s.indexOf(x) >= 0 )
 

Редактировать:

Если вы хотите найти индекс после некоторого индекса, slice скопирует массив, обходным путем будет добавление условия к функции: (s, i) => i >= index amp;amp; s.indexOf(x) >= 0

Но если я вас правильно понял, вы могли бы просто использовать .filter on sheetData :

 sheetData.filter(r => r[1].indexOf(keyword) >= 0 )
 

Комментарии:

1. спасибо за решение — оно работает, но представляет мне другую проблему… Мне нужно запустить это в цикле, чтобы найти все строки с соответствующими ключевыми словами — я использую while{} и с помощью indexOf() я могу указать начальную позицию (обновляется в каждом цикле с позиции, найденной ранее) — я не могу понять, как заставить findIndex начать поиск по определенному индексу… Я мог бы использовать slice, я думаю, но с дюжиной совпадающих результатов в таблице из более чем 1000 строк это может быть настоящей проблемой…

2. Я улучшил ответ