Warm tip: This article is reproduced from serverfault.com, please click

javascript-indexof()部分匹配问题

(javascript - indexof() partial match issue)

发布于 2020-11-27 23:34:17

使用Google App Script编码一个简单的网站

在Google工作表中有一个电子表格-2列-第一个具有名词和第二个描述性单词

谎言是这样的:

第1列-第2列

桌子-木

球-塑料

椅子-金属蓝色

我的代码在第二列中搜索关键字,并从第一列返回匹配项。当第2列中有一个单词时,它工作正常,但当第2列中有一个单词时,它就工作正常...因此,搜索“木材”返回表,搜索“塑料”返回球,但是搜索“金属”则不返回任何内容,而对于“蓝色”则相同

任何想法如何解决这个问题?

 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";
   }
Questioner
user2048695
Viewed
23
Diogo Almiro 2020-11-28 21:26:04

你的问题出在行中var position = Column2List.indexOf(x);,indexOf返回完全匹配,你应该使用findIndex并传递一个函数来搜索关键字:

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

编辑:

如果要在某个索引后找到索引,切片将复制该数组,一种变通方法是在函数中添加条件: (s, i) => i >= index && s.indexOf(x) >= 0

但是,如果我对你的理解正确,则可以.filter在上使用sheetData

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