过滤掉空数组项的代码没有报错,但并未起作用(JavaScript)

3

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

// 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() 中放置一些东西,以便它一开始只获取我需要的内容?但即使这是可能的,我仍然很想知道为什么我的筛选器不起作用。
2个回答

2

x 是一个数组,而不是一个字符串数组元素,请修改

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

你可以通过以下方式缩短你的代码(假设sheets是类似数组的,而不是直接的数组):
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 ) );

这是一种优雅的替代方案,但值得一提的是,“for”循环比“filter”要快得多。 - Gerardo Furtado
@GerardoFurtado 我同意,但是只有在需要迭代的项目数量相当高时才会注意到这种差异(我没有具体数字来说明“相当高”是多少)。 - gurvinder372
谢谢!我选择了第一个 - 其他的似乎更有效率,但我遇到了语法错误,而且现在太晚了,没法去找出原因 :P@GerardoFurtado,至于数量,目前只有3张表格,所以速度不是问题 - 但如果增加了,我会记住这一点的。 - David Tonkin

0
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,这正是您需要的精确过滤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接