早上好,
我一直在尝试过滤函数的一些语法,但我无法理解为什么特定情况没有过滤。
最终目标是从我的电子表格中获取一个范围,并使用该函数传递一个值以在该范围内过滤掉。
以下示例代码运行良好
----(这正确删除了值 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)}
---- 在下面的代码中,我已将相同的数组移动到谷歌表格,并且代码也正确返回 [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],范围不变
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)
}
有什么提示吗?
最佳答案
这里的问题是 result of sheet.getRange("A3:A9").getValues()
is an array of arrays of objects 。你说你正在过滤数组 [0,5,8,0,88,6,0]
但它的结构实际上是一个数组的数组,里面有对象: [[new Number (0)],[新号码(5)],[新号码(8)],[新号码(0)],[新号码(88)],[新号码(6)],[新号码(0) )]]
。
这解释了为什么您的 excl != 6
测试能够正确过滤 [new Number(6)]
,因为 [new Number(6)] != 6
实际上是false
。对于与数字原语的非严格比较,左侧数组将转换为其内容的字符串表示形式,在本例中为 "6"
(这是 new 的字符串表示形式)数字(6)
)。在非严格比较中,"6"
等于 6
,因此不等运算 !=
会产生 false
。
excl != this
检查失败,因为 filter
将其 thisArg
强制为一个对象,所以它就像 new Number(6 )
。由于数组和 Number 对象都是对象,因此 JavaScript 不会进行类型强制,只是检查运算符两侧是否有相同的对象。在本例中,它们是两个不同的对象,因此不等运算 !=
产生 true
。
- 您可以使用一元
+
运算符将this
重新转换为数字基元:excl != +this
。 - 此外,您可以通过从文件管理器考虑的数组中取出第一个元素(因为您的输入无论如何都只有一列)并将其转换为原语来进行更清晰的比较:
+excl[0] != +这个
。 - 最后,由于现在双方都是原语,因此您可以使用严格比较:
+excl[0] !== +this
关于javascript - JS过滤功能。这个说法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46284489/