1

私は機能を持っています:

function composeLootTables(lootType, result) {
    for (var d in lootType.items) {
        if (result[lootType.title] === undefined) {
            result[lootType.title] = [[0],[0]];
        }
        result[lootType.title][d][0] = lootType.items[d][0];
        result[lootType.title][d][1] = lootType.items[d][1];
        composeLootTables(lootType.items[d][0], result);
    }
    return result;
}

最初にこれを解析します:

residential : {
    title: "residential",
    items:[
        [generic, 0.7],
        [military, 0.7],
        [hospital, 0.7],
        [Colt1911, 0.5]
   ]
},

そして、その他の rootType は次のいずれかになります。

var Colt1911 = {
    title: "Colt 1911"
};
var generic = {
     title: "Generic",
     items: [[tin_can, 0.2],[jelly_bean, 0.3]]
};
var military = {
    title: "Military",
    items: [[bfg, 0.2],[akm, 0.3]]
};
var hospital = {
    title: "Hospital",
    items: [[condoms, 0.2],[zelyonka, 0.3]]
};

したがって、問題は次の文字列にあります。

 result[lootType.title][d][0] = lootType.items[d][0];
 result[lootType.title][d][1] = lootType.items[d][1];

Uncaught TypeError: Cannot set property '0' of undefined 

console.log によるとresult[lootType][d] === undefined、「d」が 2 または 3 になった場合のみ (それ以外の場合は「d」=== 0 または 1)。

配列の未定義フィールドに値を割り当てると、この値で埋められると想定していました。

私はすでに解決策を見つけています -

result[lootType.title][d] = lootType.items[d];

正常に動作し、適切な 2 次元配列を返しますが、それらの配列との関係を知りたいです。

4

1 に答える 1

0

results問題は、引数として渡したオブジェクトであると言わざるを得ません。それらのインデックスに十分な配列が作成されていない場合、それらの場所は未定義になり、それらに割り当てようとするとスローされます。修正されたバージョンは、すでに初期化された配列への参照をコピーするため、機能します。

于 2012-09-15T12:50:47.780 に答える