早上好,
我一直在尝试使用过滤器功能的一些语法,而我却无法理解为什么特定情况不会过滤。
最终目标是从我的电子表格中获取一个范围,然后使用该函数传递一个值以过滤掉该范围。
以下示例代码正常
----(这正确地删除了值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)
}
任何提示?
答案 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
检查失败,因为filter
将thisArg
强制转换为某个对象,因此它与new Number(6)
类似。由于数组和Number
对象都是对象,因此JavaScript不进行类型强制,只检查运算符两侧是否存在相同的对象。在这种情况下,它们是两个不同的对象,因此不等式运算!=
会产生true
。
this
运算符将+
重新转换为数字原语:excl != +this
。+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));
}