繁体   English   中英

如何从 JavaScript 中的多维数组中删除空的 arrays?

[英]How to remove empty arrays from multidimensional array in JavaScript?

我在从谷歌表格中的搜索应用程序的多维数组中删除空数组/对象时遇到问题。 我正在使用getLastRow所以我想我会避免这个问题,但不幸的是它不是。

我的数组如下所示:

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

我正在寻找可以从数组末尾删除空 arrays 的东西,所以它应该是这样的:

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

它只是整个数组的一部分,但我希望你能理解我在寻找什么。

到目前为止我的代码:

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);

}

你的 function 应该看起来像

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);

}

我正在使用 getLastRow 所以我想我会避免这个问题,但不幸的是它不是。

getRange语法是

getRange(row, column, numRows, numColumns)

该脚本正在使用

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

第三个参数是numRows - 行数。 如果最后一行是 10,则您将获得从第 4 行到第 14 行(4+10)的范围。 要在第 10 行结束,行数应该是 7。因此正确的范围应该是

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

这种空行的另一种可能性是传统使用数组公式。 请参阅ArrayFormula 正在破坏 getLastRow() 函数。 可能的解决方法?

你想使用 filter() 和 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);

您可以加入数组中的元素,然后检查它们的长度以进行过滤

 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);

也许尝试这样的事情。 您只想删除所有数组元素都未定义的 arrays。

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

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

你可以试试。

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)

暂无
暂无

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

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