在主干网中过滤的 ID 数组上使用 .set

Using .set on a filtered array of IDs in backbone

本文关键字:set 数组 ID 主干网 过滤      更新时间:2023-09-26

我使用了Underscore.js的_.filter来获取一个对象ID数组,如下所示:

var downstreamMeters = _.filter(that.collection.models, function(item) { return item.get("isdownstreammeter"); });

现在我想设置数组中每个模型的特定属性。我认为这样做是有意义的:

for (var i = 0; i < downstreamMeters.length; i++) {
    var sum = 0;
    inputMeters = downstreamMeters[i].get("inputmeters");
    for (var i = 0; i < inputMeters.length; i++) {
        var flow = parseFloat(that.collection.get(inputMeters[i]).get("adjustedflow"));
        sum += flow;
    }
    downstreamMeters[i].set({incrementalflow: sum});
}

但是,我收到错误:

Uncaught TypeError: Cannot call method 'set' of undefined

我检查了downstreamMeters数组,它包含正确的对象。我需要做什么来为数组中的每个模型设置属性?

for(var i = 0; ...)有点误导。JavaScript 将所有var声明提升到最接近的作用域的顶部,并且for循环不会创建自己的作用域。结果是:

for (var i = 0; i < downstreamMeters.length; i++) {
    var sum = 0;
    inputMeters = downstreamMeters[i].get("inputmeters");
    for (var i = 0; i < inputMeters.length; i++) {
        var flow = parseFloat(that.collection.get(inputMeters[i]).get("adjustedflow"));
        sum += flow;
    }
    downstreamMeters[i].set({incrementalflow: sum});
}

同这个:

var i, sum, flow;
for (i = 0; i < downstreamMeters.length; i++) {
    sum = 0;
    inputMeters = downstreamMeters[i].get("inputmeters");
    for (i = 0; i < inputMeters.length; i++) {
        flow = parseFloat(that.collection.get(inputMeters[i]).get("adjustedflow"));
        sum += flow;
    }
    downstreamMeters[i].set({incrementalflow: sum});
}

现在您可以看到您在外部和内部循环中使用完全相同的i。在第一次运行循环时,当您说downstreamMeters[i].set(...)时,iinputMeters.length。显然,inputMeters.length > downstreamMeters.length,所以你最终跑掉了downstreamMeters的尽头;如果您尝试访问数组中超过数组末尾的元素,则会得到undefined并且有您的

不能调用未定义的方法"set"。

错误。

嵌套循环很好,但您应该使用不同的变量:

var i, j, sum, inputMeters;
for (i = 0; i < downstreamMeters.length; i++) {
    sum = 0;
    inputMeters = downstreamMeters[i].get("inputmeters");
    for (j = 0; j < inputMeters.length; j++)
        sum += parseFloat(that.collection.get(inputMeters[j]).get("adjustedflow"));
    downstreamMeters[i].set({incrementalflow: sum});
}