Как удалить нулевые значения из массива в массиве? - PullRequest
0 голосов
/ 22 апреля 2019

Я работаю с Google Sheets и Google Apps Scripting.Я использовал .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 ]

2 голосов
/ 22 апреля 2019

Я знаю, что могу пробежаться по каждому массиву и удалить пустые ... это практически ваши единственные варианты.Существуют методы, которые делают ваш код более чистым, но за кулисами что-то должно пройти через массив.

Вот пример использования 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);
0 голосов
/ 23 апреля 2019

Просто из любопытства я выполнил эти четыре функции по 10 раз по 3 столбцам и 1000 строкам данных.Частично мне было интересно узнать больше об этих методах массива, потому что я только начал их использовать.Так что я в них точно не разбираюсь.

Код:

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

0 голосов
/ 22 апреля 2019

Если у вас есть следующий тип массива, мы можем избавиться от пустых данных, используя метод фильтра.

var data=[["user1", , ], ["user2", "user3", ], ["user4", "user5", "user6"]];

data.filter(a => a.filter( b => b.length>0));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...