javascript - 使用 'broad match' 样式的过滤方法根据 Google Apps 脚本中的另一个数组过滤数组

标签 javascript arrays google-apps-script google-sheets filtering

我对 JavaScript 还很陌生,可能需要一些帮助来解决以下问题:即,使用数组作为我想要从数据中删除/过滤的项目的输入来过滤 Google Apps 脚本中的数据。在@Cooper的帮助下,我弄清楚了如何正确地做到这一点,他在以下线程中提供了正确的答案:

Filtering an array based on another Array in Google Apps Script

但是,这一点很重要,我不仅想过滤完全匹配的数据,还想过滤广泛匹配的数据。下面的代码确实正确过滤了我的数据,但仅排除完全匹配。例如,如果我的数组 toExclude 包含 'red',则所有包含单词 'red' 的行都会被排除。那是好消息。但包含“红酒”等内容的行仍保留在我的数据集中。这就是我想要改变的。

我正在处理的数据如下所示,下面指定了我想要过滤/删除的一些示例项目:

function main() {

// create some example data.
var data = [ [ 3, 15, 52 ],
           [ 'red wine', 18, 64 ],
           [ 'blue', 11, 55 ],
           [ 'shoes', 9, 18 ],
           [ 'car door', 7, 11 ],
           [ 50, 34, 30 ],
           [ 'house party', 10, 17 ],
           [ 'party', 12, 13 ],
           [ 'cheap beer', 30, 15 ] ];


// define filtered items.
var toExclude = [ 3, 'red', 'door', 'party', '' ];


// run the filter provided by @Cooper.
  var d=0;
  for(var i=0;i-d<data.length;i++) {
    for(var j=0;j<data[i-d].length;j++) {
      if(toExclude.indexOf(data[i-d][j])!=-1) {
        data.splice(i-d++,1);//remove the row and increment the delete counter
        break;//break out of inner loop since row is deleted
      }
    }
  }
  console.log(data);
}

这是我的输出应该是什么样的:

// how the output actually looks.
 [ [ 'red wine', 18, 64 ],         // supposed to be filtered out since 'red' is included.
  [ 'blue', 11, 55 ],
  [ 'shoes', 9, 18 ],
  [ 'car door', 7, 11 ],
  [ 50, 34, 30 ],
  [ 'house party', 10, 17 ],      // supposed to be filtered out since 'party' is included.
  [ 'cheap beer', 30, 15 ] ]

// how it should look.
 [[ 'blue', 11, 55 ],
  [ 'shoes', 9, 18 ],
  [ 'car door', 7, 11 ],
  [ 50, 34, 30 ],
  [ 'cheap beer', 30, 15 ] ]

有人知道如何解决我的问题吗?我知道问题出在命令的工作方式上。具体来说,我检查先前定义的变量 toExclude 是否是我的数据的一部分,从而仅删除输出为 TRUE 的行(仅当发生完全匹配时)。我怎样才能改变这一点?我知道单个输入是可能的,但无法将此逻辑应用于上面这个相当复杂的代码。

感谢您的帮助!

最佳答案

您可以通过检查值来排除并使用 Array#filterArray#some .

var data = [[3, 15, 52], ['red wine', 18, 64], ['blue', 11, 55], ['shoes', 9, 18], ['car door', 7, 11], [50, 34, 30], ['house party', 10, 17], ['party', 12, 13], ['cheap beer', 30, 15]],
    toExclude = [3, 'red', 'door', 'party', ''],
    result = data.filter(a => 
        !a.some(v => 
            toExclude.some(w => v === w || w && typeof v === 'string' && v.includes(w))
        )
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 使用 'broad match' 样式的过滤方法根据 Google Apps 脚本中的另一个数组过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61834513/

相关文章:

更改c指针值的正确方法

javascript - 推送并删除数组的重复项

java - 如何找出用户在 Java JtextField 中输入的文本字段?

javascript - 为什么在 Google Script 中由时间驱动的触发器执行时函数参数的值不是未定义的?

c# - 使用 .net 从 html 页面解析(提取)内容

javascript - JSF inputHidden ,如何动态禁用它们?

javascript - JQuery Onchange 事件不适用于生产环境,但适用于我的本地实例

javascript - 如何将链接分配给类元素?

html - 谷歌应用程序脚本 HTMLService 按钮单击打开新的空白选项卡

javascript - 根据谷歌表格中缺失的数据创建表单