You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Backbone.js报错:Object不支持‘each’属性或方法求助

解决Backbone.js集合中hasMixedCurrency方法的报错问题

嘿,你的问题很典型,刚接触Backbone的时候很容易踩这个坑!

报错原因

你在hasMixedCurrency方法里调用了this.models.each(),但这里的this.models是原生JavaScript数组,它并没有Backbone集合特有的each方法——只有Backbone.Collection实例本身才有each方法,原生数组的遍历方法是forEach,不过我们通常用Underscore提供的工具方法来处理。

修复方案

这里有几种简单的修复方式,选你习惯的就行:

方案1:直接使用Collection实例的each方法

Backbone.Collection本身就自带each方法,直接用this.each()代替this.models.each()就好,代码更简洁:

hasMixedCurrency: function () {
    var currCode = '';
    this.each(function (model) {
        if (currCode == '') // 识别集合中第一个AfeDetail对象的currencyCode
            currCode = model.get('currencyCode');
        else if (currCode != model.get('currencyCode')) // 集合中后续AfeDetail的currencyCode发生变化
            return true;
    });
    return false;
}

方案2:用Underscore的_.each遍历models数组

因为Backbone依赖Underscore,所以可以直接用_.each()来遍历原生数组:

hasMixedCurrency: function () {
    var currCode = '';
    _.each(this.models, function (model) {
        if (currCode == '') 
            currCode = model.get('currencyCode');
        else if (currCode != model.get('currencyCode')) 
            return true;
    });
    return false;
}

额外优化建议

顺便提一句,你原代码里的return true其实不会立刻让整个方法返回,因为each会遍历完所有元素才停止。如果想让逻辑更高效,一旦发现不同的currencyCode就终止遍历,可以用Underscore的_.some方法:

hasMixedCurrency: function () {
    // 先获取第一个模型的currencyCode,处理集合为空的情况
    var firstModel = this.at(0);
    if (!firstModel) return false;
    var currCode = firstModel.get('currencyCode');
    
    // _.some会在找到第一个符合条件的元素时立刻返回true,停止遍历
    return _.some(this.models, function(model) {
        return model.get('currencyCode') !== currCode;
    });
}

这个写法不仅更高效,逻辑也更清晰,推荐你试试~

内容的提问来源于stack exchange,提问作者PongGod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:38:54