繁体   English   中英

根据 Google Apps 脚本中的另一个数组过滤数组

[英]Filtering an array based on another Array in Google Apps Script

我对 JavaScript 还很陌生,可能需要一些帮助来解决我在使用 Google Apps 脚本时遇到的问题。

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

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

// 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 ] ]

希望你们能指出我正确的方向,并帮助我理解我在这里犯错的地方。

谢谢!

我会用你所有不需要的键制作一个 object,然后我会用它们来过滤你的数据数组。

const ObjectOfKeys = keys.reduce((acc,rec)=> {
                        let nextAcc = acc;
                        nextAcc[rec] = true;
                        return nextAcc;
                        },{}};

const filteredData = data.filter(rec => !ObjectKeys[rec[0]])

或者,如果您的密钥是唯一的,您可以跳过制作 object。

const filterData = data.filter(rec =>.keys.includes(rec)) 注意,如果你的 key 是 'apple' 而 data[0] 是 'a',这将不起作用。 所以第一种方法将确保没有这样的条件会导致代码关闭。

尝试这个:

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 output。 数据来自视图执行 output。

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

创建一键并使用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);

// 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 ] ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM