【发布时间】:2016-06-15 08:54:21
【问题描述】:
我无法理解 _.filter() 函数在 undescorejs 中的工作原理。具体来说,我想了解是否有办法从被过滤的对象返回值,而不是索引。
假设如下:
var A = [1,2,3,4,5,8,10,12,15,20,25,30];
现在有了标准实现:
_.filter(A, function(x) { return x % 5 == 0 ;})
这将返回 [5,10,15,20,25,30]。我的问题出现在以下几点:
_.filter([0,1,2,3,4,5,6], function(x) { return this[x] % 5 == 0 ;}, A)
这将返回 [4,6],它们是真值(可被 5 整除)的索引。但我想从原始数组返回真实索引的值,即 [5,10]。
根据我对 _.each() 和 _.map() 等其他 underscore.js 函数的理解,这就是我使用上下文调用函数的方式。
_.map([0,1,2,3,4,5,6], function(x) { return this[x] % 5 == 0 ; }, A)
返回 [false,false,false,false,true,false,true]。我知道 _.filter() 在内部调用 _.each() 来处理数组。因此,我对 _.filter([0,1,2,3,4,5,6], function(x) { return this[x] % 5 == 0 ;}, A) 的调用不起作用是有道理的,因为 _.each() 调用未在其函数中接收到 this[x] 值。
我只是遗漏了什么,还是没有办法调用 _.filter() 来返回值?
【问题讨论】:
-
为什么要使用这个?
-
@JordanHendrix 我只是想更好地了解情况。
-
您的示例有点复杂,因此很难判断在使用 _.filter 时需要使用这些数组的哪些部分。您可以使用下划线的链接机制来映射您获得的结果并返回值:underscorejs.org/#chain
-
@kinakuta 抱歉措辞不佳。我只是想解释使用上下文时 _.each() 和 _.filter() 函数之间的操作差异。在对源代码进行更彻底的阅读之后,我相信答案是在 _.filter() 中,对 _.each() 的调用被称为
_.each(obj, function(value, index, list) { if (predicate(value, index, list)) results.push(value);})所以无论传递给 filter(谓词)的函数返回什么,如只要谓词解析为真值,就会被推送到结果。其中value是真值的索引。
标签: javascript pointers underscore.js