针对IF语句测试范围值数组的最佳方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了针对IF语句测试范围值数组的最佳方法相关的知识,希望对你有一定的参考价值。

作为为我的组织构建电子表格工具的一部分,我需要尽可能多地说明工具,这意味着在允许函数运行之前检查一些条件。我有一个版本的代码运行,但我想知道是否有一种方法来优化它。

在下面的代码中,我使用for循环来检查Col B中的行是否具有空值,同时在同一行上的Col C,D,E或F中具有一些值。

如果条件为真至少一次,则我们停止循环并提醒用户。如果数组通过检查,那么我们在循环结束时做一些事情。

我们可以完全避免循环吗?如何优化代码?

我做了一些研究,但是。考虑到Google Apps脚本中的一系列有价值的数组结构,每个或者。似乎都不会削减它。

这是我感兴趣的部分的代码摘要:

function myFunc() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet(),
      bench = sheet.getSheets()[0].getRange('B1:F14').getValues();
  
  for (var c = 0; c < bench.length; c++) {
    
    var check = bench[c];
    
    if (check[0] === '' && ((check[1] || check[2] || check[3] || check[4]) != '')) { // check if a row in Col B as an empty value while having a value in Col C,D,E or F
      
      SpreadsheetApp.getUi().alert("line " + (c + 1) + " has no company name");
      break;
      
    } else { // everything pitchy
      
      if (c == (bench.length - 1)) {
        
        //Function run normaly
        
      }
      
    }
    
  }
  
}
答案

只有当先前的数据不影响后续数据并且无论循环何时中断时编辑数据,您都可以使用代码。

在这种情况下,您可以通过尽可能早地保留嵌套条件来简化代码的外观:

function myFunc() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var bench = sheet
    .getSheets()[0]
    .getRange('B1:F14')
    .getValues();
  var client = bench[1][0];

  if (client === '') {
    // check if client name is not empty
    SpreadsheetApp.getUi().alert('client is empty');
    return;
  }

  for (var c = 0; c < bench.length; c++) {
    var check = bench[c];

    if (
      check[0] === '' &&
      [check[1], check[2], check[3], check[4]].join('') !== ''
    ) {
      // check if a row in Col B as an empty value while having a value in Col C,D,E or F

      SpreadsheetApp.getUi().alert('line ' + (c + 1) + ' has no company name');
      break;
    }
    // everything pitchy

    if (c == bench.length - 1) {
      // Function run normaly
    }
  }
}

否则,最好事先检查数据并使用有效的数组:

function myFunc() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var bench = sheet
    .getSheets()[0]
    .getRange('B1:F14')
    .getValues();
  var client = bench[1][0];

  if (client === '') {
    // check if client name is not empty
    SpreadsheetApp.getUi().alert('client is empty');
    return;
  }

  var chcker = bench
    .filter(function(check) {
      return (
        check[0] === '' &&
        [check[1], check[2], check[3], check[4]].join('') !== ''
      );
    })
    .map(function(_, i) {
      return 'line ' + (i + 1) + ' has no company name';
    });
  if (chcker.length) {
    SpreadsheetApp.getUi().alert(chcker.join('
'));
    return;
  }

  for (var c = 0; c < bench.length; c++) {
    if (c == bench.length - 1) {
      // Function run normaly
    }
  }
}

如果你不循环所有你可以添加findIndex polyfill

var chcker = bench
    .findIndex(function(check) {
      return (
        check[0] === '' &&
        [check[1], check[2], check[3], check[4]].join('') !== ''
      );
    });
if(chcker !== -1) { // The data invalid
另一答案

“一些”是方法。条件看起来像

var condition = check[0] === ''  && check.slice(1).some(function(item) { return item != '';});

以上是关于针对IF语句测试范围值数组的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Matlab编程语言,五条件语句

针对用户输入测试字符串和整数数组

逻辑或查找表:最佳实践

是否有另一种方法可以在不使用 if 语句的情况下有条件地增加数组值? C++

编写代码片段的更简洁的方法

在 MySQL 数据库中存储数组的最佳方法?