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これで、外側と内側のループでまったく同じものを使用していることがわかります。ループの最初の実行では、と言うときになりiます。どうやら、;の最後を使い果たしてしまうようです。配列の終わりを過ぎた配列の要素にアクセスしようとすると、取得され、そこにあなたのinputMeters.lengthdownstreamMeters[i].set(...)inputMeters.length > downstreamMeters.lengthdownstreamMetersundefined

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