0

我使用 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数组,它里面有正确的对象。我需要做什么来为数组中的每个模型设置属性?

4

1 回答 1

0

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

无法调用未定义的方法“设置”。

错误。

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

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});
}
于 2012-06-10T19:56:48.223 回答