【问题标题】:Filtering an array based on another Array in Google Apps Script using a 'broad match'-style filtering method使用“广泛匹配”样式过滤方法基于 Google Apps 脚本中的另一个数组过滤数组
【发布时间】:2020-09-02 04:20:24
【问题描述】:

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

Filtering an array based on another Array in Google Apps Script

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

我正在处理的数据看起来像这样,下面指定了一些我想过滤/删除的示例项目:

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 的行,这仅在发生完全匹配的情况下。我该如何改变呢?我知道单输入是可能的,但不能将此逻辑应用于上面这个相当复杂的代码。

感谢您的帮助!

【问题讨论】:

  • toExclude中的空字符串需要什么逻辑?空字符串包含在每个项目中,因此听起来您不想将其过滤掉。您是否只想过滤掉与空字符串完全匹配的内容? (但您没有任何第一项是空字符串)

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


【解决方案1】:

您可以通过检查值来排除并使用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; }

【讨论】:

  • 见鬼!你的代码运行起来就像一个魅力。我会做一些进一步的检查,以确保它适用于我的真实数据示例。但乍一看,它看起来确实如此。只是一个小问题,你的代码太复杂了,我无法理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多