gpt4 book ai didi

backbone.js - underscore.js 过滤函数

转载 作者:行者123 更新时间:2023-12-04 03:05:59 26 4
gpt4 key购买 nike

我正在尝试学习 backbone.js 和(通过扩展)underscore.js,但我在理解一些约定方面遇到了一些困难。在编写 simpel 搜索过滤器时,我认为像下面这样的东西会起作用:

var search_string = new RegExp(query, "i");

var results = _.filter(this, function(data){
return search_string.test(data.get("title"));
}));

但是,事实上,为了让它工作,我需要将我的过滤器函数更改为以下内容:

var search_string = new RegExp(query, "i");

var results = _(this.filter(function(data){
return search_string.test(data.get("title"));
}));

基本上,我想了解为什么第二个示例有效,而第一个示例无效。根据文档 (http://documentcloud.github.com/underscore/#filter),我认为前者会起作用。或者这可能只是反射(reflect)了我的一些旧 jQuery 习惯...谁能为我解释一下?

最佳答案

我猜你使用的是带有原生 Array#filter 的浏览器执行。在您的控制台中尝试这些,看看会发生什么:

[].filter.call({ a: 'b' }, function(x) { console.log(x) });
[].filter.call([1, 2], function(x) { console.log(x) });

第一个不会做任何事情,第二个会产生 12 作为输出 ( http://jsfiddle.net/ambiguous/tkRQ3/ )。问题不在于 data 为空,问题在于原生 Array#filter 在应用于非 Array 对象时不知道该做什么。

Underscore 的所有方法(包括 filter )都使用原生实现(如果可用):

Delegates to the native filter method, if it exists.

所以 Array-ish Underscore 方法通常不会作为 _.m(collection, ...) 工作,除非您使用的浏览器不提供 native 实现。

Backbone 集合是模型数组的包装器,模型数组位于 c.models 中,因此您需要:

_.filter(this.models, function(data) { ... });

主干collections have several Underscore methods混入:

Backbone proxies to Underscore.js to provide 28 iteration functions on Backbone.Collection.

其中之一是过滤器。这些代理将 Underscore 方法应用于集合的模型数组,因此 c.filter(...)_.filter(c.models, ...) 相同.

这种混合可能是混淆 "should I use the native method" 的原因检查 Underscore 正在做什么:

if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);

您可以在普通的旧对象 (_.filter({a:'b'}, ...)) 上使用 _.filter 并获得合理的结果但是当你 _.filter(backbone_collection, ...) 时它会失败,因为集合已经有 Underscore 方法。

这里有一个简单的演示,希望能澄清一些事情:http://jsfiddle.net/ambiguous/FHd3Y/1/

关于backbone.js - underscore.js 过滤函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10709908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com