最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

google apps script - How to remove empty arrays from multidimensional array in JavaScript? - Stack Overflow

programmeradmin4浏览0评论

I have a problem with removing empty arrays/objects from a multidimensional array for my search app in google sheets. I am using getLastRow so I thought I will avoid this problem but unfortunately it is not.

My array looks like this:

[[1.39080000912E11, RSSMA004025, ボタンキャップ M4X25, 4.0, 4.2, , , ], [1.39080000912E11, RWJAA058068, FTB-268, 1.0, 486.0, 486.0, , ], [, , , , , , , ], [, , , , , , , ]]

And I am looking for something that will delete empty arrays from the end of the array so it should be like this:

[[1.39080000912E11, RSSMA004025, ボタンキャップ M4X25, 4.0, 4.2, , , ], [1.39080000912E11, RWJAA058068, FTB-268, 1.0, 486.0, 486.0, , ]]

It is just a part of the whole array but I hope you will understand what I am looking for.

My code so far:

function getDataForSearch(){
    
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("WP");
  
  var test1 = ws.getRange(4, 6, ws.getLastRow(),8).getValues();

const arrFiltered = test1.filter(function(x){
  return (x !== (undefined || null || ''));
});

 Logger.log(arrFiltered);

}

I have a problem with removing empty arrays/objects from a multidimensional array for my search app in google sheets. I am using getLastRow so I thought I will avoid this problem but unfortunately it is not.

My array looks like this:

[[1.39080000912E11, RSSMA004025, ボタンキャップ M4X25, 4.0, 4.2, , , ], [1.39080000912E11, RWJAA058068, FTB-268, 1.0, 486.0, 486.0, , ], [, , , , , , , ], [, , , , , , , ]]

And I am looking for something that will delete empty arrays from the end of the array so it should be like this:

[[1.39080000912E11, RSSMA004025, ボタンキャップ M4X25, 4.0, 4.2, , , ], [1.39080000912E11, RWJAA058068, FTB-268, 1.0, 486.0, 486.0, , ]]

It is just a part of the whole array but I hope you will understand what I am looking for.

My code so far:

function getDataForSearch(){
    
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("WP");
  
  var test1 = ws.getRange(4, 6, ws.getLastRow(),8).getValues();

const arrFiltered = test1.filter(function(x){
  return (x !== (undefined || null || ''));
});

 Logger.log(arrFiltered);

}
Share Improve this question asked Jan 19, 2021 at 2:25 TimonekTimonek 3672 silver badges11 bronze badges 1
  • in your function const arrFiltered = test1.filter(function(x){ return (x !== (undefined || null || '')); });, x is an array. not an object. – LogiStack Commented Jan 19, 2021 at 2:30
Add a ment  | 

6 Answers 6

Reset to default 2

Your function should look like

function getDataForSearch() {

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("WP");

  var test1 = ws.getRange(4, 6, ws.getLastRow(), 8).getValues();

  const arrFiltered = test1.filter(function (x) { /* here, x is an array, not an object */
    return !(x.every(element => element === (undefined || null || '')))
  });

  Logger.log(arrFiltered);

}

I am using getLastRow so I thought I will avoid this problem but unfortunately it is not.

getRange syntax is

getRange(row, column, numRows, numColumns)

The script is using

ws.getRange(4, 6, ws.getLastRow(), 8).getValues();

The third parameter is numRows- the number of rows. If the last row is 10, You're getting the range from row 4 to row 14(4+10). To end at row 10, number of rows should be 7. The correct range should be therefore be

ws.getRange(1 + 3, 6, ws.getLastRow() - 3, 8).getValues();

Another possibility for such empty rows would be the traditional use of array formulas. See ArrayFormula is breaking the getLastRow() funtion. Possible workarounds?

You want to use filter() and some()

var arr = [[1.39080000912E11, 'RSSMA004025', 'ボタンキャップ M4X25', 4.0, 4.2, , , ], [1.39080000912E11, 'RWJAA058068', 'FTB-268', 1.0, 486.0, 486.0, , ], [, , , , , , , ], [, , , , , , , ]];

// Will fail for falsly values, but works in this case
var updated1 = arr.filter(function (a) {
  return a.some(Boolean);
});

// var updated1 = arr.filter(a => a.some(Boolean));
console.log(updated1);

// check for undefined
var updated2 = arr.filter(function (a) {
  return a.some(function (val) {
    return val !== undefined;
  });;
});

// var updated2 = arr.filter(a => a.some(val => val !== undefined));
console.log(updated2);

//If it can be any of the values
var empty = [undefined, null, ''];
var updated3 = arr.filter(function (a) {
  return a.some(function (val) {
    return !empty.includes(val);
  });
});

// var updated3 = arr.filter(a => a.some(val => !empty.includes(val)));
console.log(updated3);

Try something like this perhaps. You want to only remove the arrays where all of the array elements are undefined.

var funnyArrays = [['a', 'b', 'c'],  [,,,], ['d','e','f'], [,,,]];

var fullArrays = funnyArrays.filter(a => !a.every(ax=> a == undefined));

you can join the elements in the array and then check their length for filtering

let test1 = [[1.39080000912E11, 'RSSMA004025', 'uiuiu M4X25', 4.0, 4.2, , , ],[1.39080000912E11, 'RWJAA058068;', 'FTB - 268', 1.0, 486.0, 486.0, , ],[, , , , , , , ],[, , , , , , , ]]


const arrFiltered = test1.filter(function(x) {
  return (x.join('').length !== 0);
});

console.log('new array',arrFiltered);

U can try that.

const notEmptyArrayOrObject = (arr)=> {

  if(typeof arr !== 'object'){ return true }

  if(!Array.isArray(arr){
     arr = Object.values(arr)
  }

  return arr.filter(item=>item === undefined).length !== arr.length
}

const filterEmptyFromArray = (array)=>array.filter(notEmptyArrayOrObject)
发布评论

评论列表(0)

  1. 暂无评论