过滤器以摆脱空白数组条目不会给出错误,但不起作用(JavaScript)



我希望我只是错过了一些简单的东西,但我一生都看不出为什么这不起作用:

// GET ALL SHEET NAMES FROM THE SPREADSHEET AND PUT INTO AN ARRAY
function sheetNames() {
  var out = new Array()
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  for (var i=0 ; i<sheets.length ; i++) {
        out.push( [ checkSheetName(sheets[i].getName()) ] )
  }
  Logger.log("before : " + out);
  var listOfsheets = out.filter(function(x){  return (x !== (undefined || null || '')); });
  Logger.log("after : " + listOfsheets);
  return listOfsheets ;
}
// SEARCH ALL SHEETS AND ONLY SELECT THEM IF THEY HAVE THE TEXT "REPORT_" IN THE NAME
function checkSheetName(sheetName) {
  var checkFor = 'Report_'
  if (sheetName.indexOf(checkFor) >= 0) {
        return sheetName;
    } else {
      sheetName = '';
      return sheetName;
    }

我的记录器在通过过滤器之前和之后显示完全相同的结果。错误会很棒,但运行正常...只是似乎什么也没做。

我想另一个问题是,我可以在最初的 getSheets(( 中放一些东西,以便它只得到我需要的东西吗?但即使这是可能的,我仍然很好奇为什么我的过滤器不起作用

x是一个数组而不是数组项字符串,让它

out.push( checkSheetName(sheets[i].getName()) ); //observe that array wrapping is removed

你可以通过做来缩短你的代码(假设工作表是类似数组的,而不是直接数组(

return Array.from( sheets ).filter( x => !!checkSheetName( x.getName() ) );

如果sheets是一个数组,则使其

return sheets.filter( x => !!checkSheetName( x.getName() ) );

甚至没有checkSheetName

return sheets.filter( x => !!( x.getName().indexOf( "Report_" ) != -1 ) );
out.filter(function(x){  return (x !== (undefined || null || '')); });

您的过滤功能减少到

out.filter(function (x) {  return (x !== ''); });

因为引擎会查看括号内部并从左到右解析:

(x !== (undefined || null || ''))
// undefined is falsy, replace with expression on the right
(x !== (null || ''))
// null is falsy, replace with expression on the right
(x !== '')

现在看看你正在过滤的内容:

out.push( [ checkSheetName(sheets[i].getName()) ] )

在这里,您将一个带有一个元素的新数组推送到out数组上。删除方括号以仅推送名称。

由于x始终是一个数组,因此它永远不会是空字符串,并且您的过滤器不会过滤掉任何内容。即使你去掉括号,使x数组,如果xnullundefined,它仍然会通过你的过滤器。将过滤器替换为

out.filter(Boolean);

这会将您的数组值强制为布尔值。空字符串、nullundefined 都是假的,返回false 。其他字符串是真实的,并返回true,您需要的确切过滤。

相关内容

  • 没有找到相关文章

最新更新