【问题标题】:Filtering an array based on another Array in Google Apps Script根据 Google Apps 脚本中的另一个数组过滤数组
【发布时间】:2020-05-08 23:09:22
【问题描述】:

我是 JavaScript 的新手,可能需要一些帮助来解决我在使用 Google Apps 脚本时遇到的问题。

我打算根据一个数组过滤我的数据,该数组是我从特定工作表中的特定单元格中获取的,其中包含我不想保留在数据中的字符串元素。换句话说,应该从我的工作表中删除包含这些关键字的行。

到目前为止,我已经设法在我的过滤器函数中使用单个字符串元素来做到这一点。

// elements to filter out.
var keys = [['a','b','c']];

// example data.
var data = [['a',1,2],
            ['c',4,3],
            ['d',3,4]];

// my approach for a single element which works.
var filterText = "a";
var newData1 = data.filter(function(item) {
  return item[0] !== filterText;
});
console.log(newData1); // output: [ [ 'c', 4, 3 ], [ 'd', 3, 4 ] ]

但是,如果我尝试将此逻辑扩展到使用数组过滤数据的情况,我就有麻烦了。我编写了下面的代码,它正确地检查了我的数据,但没有返回预期的结果。我知道我在这里错过了代码的关键部分,但无法弄清楚它是哪一个。我把代码转了好几次,但都卡住了。

for(var n=0; n<keys[0].length; n++) {
  // console.log(keys[0][n]);
  var newData2 = data.filter(function(item) {
    // console.log(item[0] === keys[0][n]);
     return item[0] === keys[0][n];
  })
};
console.log(newData2); // output: [ [ 'c', 4, 3 ] ]

希望你们能指出我正确的方向并帮助我了解我在哪里犯了错误。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我会用你所有不需要的键创建一个对象,然后我会用它们来过滤你的数据数组。

    const ObjectOfKeys = keys.reduce((acc,rec)=> {
                            let nextAcc = acc;
                            nextAcc[rec] = true;
                            return nextAcc;
                            },{}};
    
    const filteredData = data.filter(rec => !ObjectKeys[rec[0]])
    

    另一种方法是,如果您的键是唯一的,您可以跳过制作对象。

    const filterData = data.filter(rec => !keys.includes(rec)) 笔记。例如,如果您的密钥是“apple”而 data[0] 是“a”,这将不起作用,因此第一种方法将确保没有这样的情况会导致代码关闭。

    【讨论】:

    • 我想学习如何使用这个方法,我想知道这个return nextAcc;},{}};是否应该是这个return nextAcc;},{});
    • 另外我觉得const filteredData = data.filter(rec =&gt; !ObjectKeys[rec[0]])这一行应该是这样const filteredData = data.filter(rec =&gt; !ObjectOfKeys[rec[0]])
    • 这很酷。实际上我什至没有注意到我们只需要测试第一列。
    • 你怎么知道acc是一个对象?
    • reduce 函数的最后一行是“},{})”,这就是您要求返回对象或数组(“}, [] }”)的地方。 acc -> 累加器将采用您定义为返回类型的形状。 (我没有关注您上面列出的 1st 2 cmets,如果它们仍然有效,请详细说明)
    【解决方案2】:

    试试这个:

    function myfunction() {
      var keys = [['a','b','c']][0];//flatten
      var data = [['a',1,2],['c',4,3],['d',3,4]];
      var d=0;
      for(var i=0;i-d<data.length;i++) {
        for(var j=0;j<data[i-d].length;j++) {
          if(keys.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);
    }
    

    感谢其他解决方案。我真的需要更多练习其他数组方法和箭头符号。只是为了好玩,我将数据集大小增加到 1200 行并并排运行不同的方法,下面是数据的 csv。不是很确定。每次都是相同的数据集,我对它们都使用了 console.log 输出。数据来自视图执行输出。

    Cooper,1.171
    Cooper,1.195
    Farnoosh,1.2
    Farnoosh,1.224
    Cooper,1.237
    TheMaster,1.257
    Cooper,1.264
    Farnoosh,1.347
    TheMaster,1.371
    TheMaster,1.392
    Cooper,1.503
    Farnoosh,1.513
    Farnoosh,1.563
    TheMaster,1.699
    TheMaster,1.936
    

    【讨论】:

      【解决方案3】:

      创建一个Set的密钥并使用set.has

      // elements to filter out.
      const keys = [['a','b','c']],
      keySet = new Set(keys[0]),
      
      // example data.
      data = [['a',1,2],
              ['c',4,3],
              ['d',3,4]],
      out = data.filter(([item0])=>!keySet.has(item0));
      console.info(out);

      【讨论】:

      • 这是一个有趣的想法。
      【解决方案4】:
      // elements to filter out.
      var keys = [['a','b','c']];
      
      // example data.
      var data = [['a',1,2],
                  ['c',4,3],
                  ['d',3,4]];
      
      // my approach for a single element which works.
      
      var newData1 = data.filter(function(item) {
      if (keys.indexOf(item[0]) != -1) {return item}
      });
      console.log(newData1); // output: [ [ 'c', 4, 3 ], [ 'd', 3, 4 ] ]
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
      猜你喜欢
      • 1970-01-01
      • 2020-09-02
      • 2020-04-30
      • 2014-05-03
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多