JS过滤功能。这个论点

时间:2017-09-18 16:50:59

标签: javascript google-apps-script

早上好,

我一直在尝试使用过滤器功能的一些语法,而我却无法理解为什么特定情况不会过滤。

最终目标是从我的电子表格中获取一个范围,然后使用该函数传递一个值以过滤掉该范围。

以下示例代码正常

----(这正确地删除了值6,结果数组为[0,5,8,0,88,0])

{var range = [0,5,8,0,88,6,0]

function filtro (excl) {
  return excl != this;
}

var range = range.filter(filtro,6)}

----在下面的代码中,我已将相同的数组移动到google工作表,并且代码也正确返回[0,5,8,0,88,0]

  function advancedFilter(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getSheetByName("Testes");

  var range = sheet.getRange("A3:A9").getValues();


  function filtro (excl) {
  return excl != 6;
}

  var range = range.filter(filtro)
}

---然而,当我合并上述两个想法时,最后一段代码失败并返回[0,5,8,0,88,6,0],范围不变 < / p>

function advancedFilter(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getSheetByName("Testes");

  var range = sheet.getRange("A3:A9").getValues();

  function filtro (excl) {
  return excl != this;
}

  var range = range.filter(filtro,6)
}

任何提示?

3 个答案:

答案 0 :(得分:2)

这里的问题是result of sheet.getRange("A3:A9").getValues() is an array of arrays of objects。您说您正在过滤数组[0,5,8,0,88,6,0],但其结构实际上是一个包含对象的数组数组:[[new Number(0)],[new Number(5)],[new Number(8)],[new Number(0)],[new Number(88)],[new Number(6)],[new Number(0)]]

这解释了为什么您的excl != 6测试正确过滤了[new Number(6)],因为[new Number(6)] != 6实际上是false。对于与数字原语的非严格比较,左侧数组变为其内容的字符串表示形式,在本例中为"6"(这是new Number(6)的字符串表示形式)。在非严格比较中,"6"等于6,因此不等式操作!=会产生false

excl != this检查失败,因为filterthisArg强制转换为某个对象,因此它与new Number(6)类似。由于数组和Number对象都是对象,因此JavaScript不进行类型强制,只检查运算符两侧是否存在相同的对象。在这种情况下,它们是两个不同的对象,因此不等式运算!=会产生true

  • 您可以使用一元this运算符将+重新转换为数字原语:excl != +this
  • 此外,您可以通过从filer考虑的数组中拉出第一个元素来进行更清晰的比较(因为您的输入只有一列)并将其转换为基元:+excl[0] != +this
  • 最后,既然双方现在都是原始的,你可以使用严格的比较:+excl[0] !== +this

答案 1 :(得分:0)

如果从sheet.getRange("A3:A9").getValues();返回的集合中的每个项目都是一个对象,那么测试将始终失败,因为您的this值也将是一个对象,因此它将是一个身份比较,会失败。

要解决此问题,请在严格模式中运行advancedFilter(),这样您的号码6仍然是this值的原语。这样==将与强制进行抽象比较。

function advancedFilter() {  
  "use strict"; // <===== strict mode

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getSheetByName("Testes");

  var range = sheet.getRange("A3:A9").getValues();

  function filtro (excl) {
    return excl != this; // `this` is a primitive instead of a `Number` object
  }

  var range = range.filter(filtro, 6);

  console.log(range);

  return range;
}

答案 2 :(得分:0)

不使用this,最好返回一个功能。

function advancedFilter() {

var ss =  SpreadsheetApp.getActiveSpreadsheet(); 

var sheet = ss.getSheetByName("Testes");

var range = sheet.getRange("A3:A9").getValues(); 

function filtro (excl) { 
    return function (elem) {
        return elem != excl;
    }
} 

var range = range.filter(filtro(6));

}