首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >骨干网采集过滤方式

骨干网采集过滤方式
EN

Stack Overflow用户
提问于 2013-05-15 12:13:15
回答 4查看 2.4K关注 0票数 0

有人能解释一下存在于Collection "class“中的filter()方法背后的机制吗?此方法的主干应用程序接口似乎与以下示例实现不一致(取自Todo练习@ http://addyosmani.github.io/backbone-fundamentals/):

代码语言:javascript
复制
completed: function() {
    return this.filter(function( todo ) {
        return todo.get('completed');
    });
}

此代码片段生成一个模型对象数组,该对象的“completed”属性包含"true“。但是,我无法理解这个函数是如何返回对象数组的

EN

回答 4

Stack Overflow用户

发布于 2013-12-13 01:31:13

你好奇心的关键在于给源代码加下划线。正如你可能已经知道的,在Backbone.Collection上你可以使用的大量方法都是从下划线引入的。

让我们先看看他们是如何做到这一点的:

代码语言:javascript
复制
// Underscore methods that we want to implement on the Collection.
// 90% of the core usefulness of Backbone Collections is actually implemented
// right here:
var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',
'lastIndexOf', 'isEmpty', 'chain'];

// Mix in each Underscore method as a proxy to `Collection#models`.
_.each(methods, function(method) {
    Collection.prototype[method] = function() {

      // Important: BOLT ON THE COLLECTION MODELS TO THE ARGUMENTS.
      var args = slice.call(arguments);
      args.unshift(this.models);

      // .apply (since we have an array of arguments).
      return _[method].apply(_, args);
    };
});

因此,我们有一个带下划线的方法名称列表。源代码遍历这些方法名,并将每个方法名添加到集合原型中。重要提示:您会注意到这段代码修补了参数列表,使其包含在集合的模型中。

现在看下划线的实际方法实现:

代码语言:javascript
复制
_.filter = _.select = function(obj, iterator, context) {
  var results = [];
  if (obj == null) return results;
  if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);

  each(obj, function(value, index, list) {
    if (iterator.call(context, value, index, list)) results.push(value);
  });

  return results;
}

您将注意到,过滤器只是对每个对象进行包装,并在传入的对象(属性)之间循环。backbone版本所做的全部工作就是将此方法放入上下文中,以使您不必每次都传入模型。

票数 1
EN

Stack Overflow用户

发布于 2013-05-15 12:18:28

代码语言:javascript
复制
return todo.get('completed');

基本上对应于这个

代码语言:javascript
复制
return todo.get('completed') === true ;

因此,集合中的所有todo Models属性completed都设置为true将从最内部的返回语句返回

最外层的返回值将返回filter函数满足条件的所有模型的集合。

这可以简单地写成

代码语言:javascript
复制
completed: function() {
    var filteredModels =  this.filter(function( todo ) {
        return todo.get('completed');
    });

    return filteredModels;
}
票数 0
EN

Stack Overflow用户

发布于 2013-05-15 13:17:15

Filter方法为结果创建空数组并遍历this.models。如果iterator函数返回真值,则将模型推送到结果数组中。在您的示例中,iterator

代码语言:javascript
复制
function (todo) {
  return todo.get('completed');
}

iterator返回一些经过真值检查的值

代码语言:javascript
复制
// simplified call
if (iterator()) results.push(value)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16556731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档