【问题标题】:underscore.js filter function using contextunderscore.js 使用上下文过滤函数
【发布时间】: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


【解决方案1】:

像这样?:

var indexes = [0,1,2,3,4,5,6];
_.filter(A, function(x, i) {
    return x % 5 == 0 && indexes.indexOf(i) > -1;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2017-10-19
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多