看看_.map
源代码,你会看到,从 1.5.1 版本开始
_.map = _.collect = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
results.push(iterator.call(context, value, index, list));
});
return results;
};
这意味着对于 中的每个对象selected
,您将以Backbone.Model.prototype.toJSON.call.call
未指定的上下文结尾,这可能不是您想要的。
调用toJSON
每个模型的最简单方法是使用_.invoke
:
invoke _.invoke(list, methodName, [*arguments])
对列表中的每个值调用由 methodName 命名的方法。
适用于您的案例:
var mapped = _.invoke(selected, 'toJSON');
和一个演示
var c = new Backbone.Collection([
{id: 1, checked: true},
{id: 2, checked: false},
{id: 3, checked: true}
]);
var selected = c.where({checked: true});
var mapped = _.invoke(selected, 'toJSON');
console.log(mapped);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>