我有这个功能:
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]
]
},
然后其他人lootType成为其中之一:
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];
工作正常,它返回正确的二维数组,但我想知道这些数组的处理是什么。
答案 0 :(得分:0)
我不得不说问题是你作为参数传递的results
对象。如果它没有在这些索引上创建足够的数组,那么这些位置将是未定义的,并且在您尝试分配它们时将会抛出。您的修改版本可以工作,因为它复制了对已经初始化的数组的引用。