代码之家  ›  专栏  ›  技术社区  ›  DanCue

非敏感非精确匹配字符串的搜索数组

  •  0
  • DanCue  · 技术社区  · 8 年前

    注意:我对原来的问题做了一些修改,因为我的问题不是字符串中的逗号。

    我有一个函数,我一直致力于从一个新数组中排除一个单元格值,这个数组包含一个我正在搜索的字符串。我这么做是为了把 .setHiddenValues ,自 .setVisibleValues 尚未支持/实现。

    为了清楚起见,我的要求如下:

    当前工作:

    • 能处理数字和字符串
    • 可以搜索小写和大写。 visibleValueStr 是用户输入的,所以不太敏感。
    • colValueArr 可能有带逗号的字符串。

    仍在努力:

    • 可视值str 可以是单个值或数组。
    • 区分大小写(“apple”与“apple”匹配)
    • 不完全匹配(“apple”与“apple and banana”匹配)

    以下是我目前在满足/未满足上述条件下的功能:

    function getHiddenValueArray(colValueArr,visibleValueArr){
      var flatUniqArr = colValueArr.map(function(e){return e[0].toString();})
        .filter(function(e,i,a){
          return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) == -1);
        })
      return flatUniqArr;
    }
    

    请让我知道我还需要什么信息。我会在继续研究的同时更新这个问题。

    评论澄清:

    用户在HTML表单上输入输入,变量作为 visibleValueArr .

    使用时 Logger.log(visibleValueArr) .

    [apple, banana]
    

    使用时 Logger.log(colValueArr) .

    [[Apple],[apple][apple][apple and banana],[apple],[banana, and apple],
      [apple, and banana],[orange],[orange, and banana],[kiwi],[kiwi, and orange],
      [strawberry]]
    

    所以当我使用:

    SpreadsheetApp.newFilterCriteria().setHiddenValues(newArray).build();
    

    newArray 应该是隐藏的值。在这种情况下,应该是:

    • 橙色
    • 几维鸟
    • 奇异果和橘子
    • 草莓

    基本上任何不包含 可视值 是。

    相反,它返回所有值,并将其全部隐藏。

    当我使用 [Apple, Banana] “Apple”和“Banana”的值不在newArray中,但“Apple和Banana”和“Apple和Banana”不是

    此外,我还想了解 e,i,a 在里面 function(e,i,a) 代表。我想申请 .toLowerCase() 在不同的地方,看看这是否解决了我的部分问题,但我不知道在哪里做。

    1 回复  |  直到 8 年前
        1
  •  2
  •   TheMaster    8 年前

    问题:

    • 区分大小写(“apple”与“apple”匹配)
    • 不完全匹配(“apple”与“apple and banana”匹配)

    解决方案:

    • 使用不区分大小写的正则表达式搜索

    修改脚本:

        function getHiddenValueArray(colValueArr,visibleValueArr){
          /*colValueArr = [["Apple"],["apple"],["orange"],["Apple, and Banana"]];
          visibleValueArr = ['apple','banana'];*/
          var flatUniqArr = colValueArr.map(function(e){return e[0].toString();})
            .filter(function(e,i,a){
              return (a.indexOf(e)==i && !(visibleValueArr.some(function(f){
                return e.search(new RegExp(f,'i'))+1;
              })));
            });
          //Logger.log(flatUniqArr); will log orange
          return flatUniqArr;
        }
    

    参考文献: