如何从数组中的数组中删除空值?

时间:2019-04-22 15:00:03

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

我正在使用Google表格和Google Apps脚本。我已经使用.getRange().getValues从工作表中获取用户电子邮件。

收到的示例数组: [[user1, , ], [user2, user3, ], [user4, user5, user6]]

如您所见,每行(内部数组)最多可能有三个用户。但是,其中一些单元格为空,从而导致数组中的值为空。然后,我将每个内部数组送入.addEditors()中,由于用户为空,这会引发错误。

我知道我可以遍历每个数组并删除空对象,然后将该新数组推入.addEditors()中,但是这样做很丑陋,而且效率很低。我没有足够的经验来知道如何开发一种更优雅的方式。

有人可以帮助我了解如何以及为什么以尽可能有效的方式解决此问题吗?谢谢。

注意:尽管.filter(Boolean)解决方案似乎可行,但我只能使它适用于单个数组,而不适用于数组中的数组。

var myFilterArray = myArray.filter(Boolean);

    arr.forEach(function(x){
      return x.filter(Boolean);
    });

如果深度大于一,我将无法返回修改后的数组。

3 个答案:

答案 0 :(得分:2)

我知道我可以遍历每个数组并删除空容器 ...这几乎是您唯一的选择。有一些方法可以使您的代码看起来更整洁,但是在幕后必须要遍历数组。

以下是使用Array.map()Array.filter()的示例

let data = [["bob", , ], ["jake", "john", ""], ["joe", "henry", "morgan"]];
let newData = data.map(x => {
  return x.filter(j => j)
})
console.log(newData);

使用ES5语法

var data = [["bob", , ], ["jake", "john", ""], ["joe", "henry", "morgan"]];
var newData = data.map(function(x) {
  return x.filter(function(j) {if (j) return j})
})
console.log(newData);

答案 1 :(得分:0)

如果您具有以下类型的数组,则可以使用过滤器方法清除空数据。

create-react-app

答案 2 :(得分:0)

出于好奇,我在3列和1000行数据中对这四个函数分别运行了10次。部分地,我有兴趣了解更多有关这些数组方法的信息,因为我刚刚开始使用它们。所以我肯定不是他们的专家。

代码:

function removeFalsies1() {
  var start=new Date();
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var vU=[];
  var cnt=0;
  for(var i=1;i<vA.length;i++){
    for(var j=0;j<vA[i].length;j++) {
      cnt++;
      if(vA[i][j]) {
        vU.push(vA[i][j]);
      }
    }
  }
  var end=new Date();
  return Utilities.formatString('1,%s',seconds_(start,end));
}

function removeFalsies2() {
  var start=new Date();
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var cnt=0;
  var vU=[];
  vA.forEach(function(r,i,A){ 
    if(i>0) {
      for(var n=0;n<A[i].length;n++){
        var rA=[];
        cnt++;
        if(A[i][n] && i>0){
          vU.push(A[i][n]);
        }
      }
    }
    return rA;
  });
  var end=new Date();
  return Utilities.formatString('2,%s',seconds_(start,end));
}

function removeFalsies3() {
  var start=new Date();
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var cnt=0;
  var vU=[];
  vA.forEach(function(r,i,A){if(i>0){r.forEach(function(rix,ix,r){if(rix){vU.push(rix);}cnt++;})}});
  var end=new Date();
  return Utilities.formatString('3,%s',seconds_(start,end));
}

function removeFalsies4() {
  var start=new Date();
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var cnt=0;
  var vU=[];
  vA.map(function(r,i) {if(i>0){return r.filter(function(rix){if(rix){vU.push(rix);}cnt++;})}});
  var end=new Date();
  return Utilities.formatString('4,%s',seconds_(start,end));
}

数据:

一位数字表示功能名称中的最后一位。 enter image description here