var geartable = {
shittyboots: {
name: "Shitty Boots",
cost: "500"
},
shittyarmor: {
name: "Shitty Armor",
cost: "1000"
},
shittyhelmet: {
name: "Shitty Helmet",
cost: "750"
}
};
var shops = {
positions: [
[2, 3],
[0, 1],
[2, 4]
],
inventory: [
[geartable.shittyboots.name, geartable.shittyboots.cost, "Available"],
[geartable.shittyarmor.name, geartable.shittyarmor.cost, "Available"],
[geartable.shittyhelmet.name, geartable.shittyhelmet.cost, "Available"]
]
};
function pickRandomItem(gearlist) {
var result;
var count = 0;
for (var item in gearlist) {
if (Math.random() < 1 / ++count) {
result = item;
}
}
console.log(geartable.result.cost);
return result;
}
你好。所以,简单地说,我的问题是我试图访问父对象属性的index / a属性,但是当我在geartable上运行随机选择器函数(pickRandomItem)并尝试访问结果的属性时,它告诉我geartable.result.cost是未定义的。我认为这是因为出于某种不可思议的原因,JavaScript试图在geartable内查找属性“结果”,而不是在geartable内查找具有result值的属性。
有什么办法解决吗?我处在困境的尽头,我无法想象有这样的情况,因为对象嵌套原本就很不固定。我已经尝试过使用数组代替嵌套对象,但是geartable.result [0] ...等仍返回未定义。
如果您好奇,这是JavaScript控制台中的错误:
pickRandomItem(geartable);
TypeError: geartable.result is undefined; can't access its "cost" property[Learn More]
答案 0 :(得分:0)
一个问题是:
for (var item in gearlist) {
// ...
result = item;
// ...
console.log(geartable.result.cost);
for..in
循环遍历属性名称(不是值),并且result
永远不会成为geartable
的属性。如果要在对象上放置result
属性,则必须显式分配它:
for (var item in gearlist) {
if (Math.random() < 1 / ++count) {
gearlist.result = gearlist[item];
}
}
然后您将来可以访问gearlist.result
。或者,如果您不想更改输入对象,只需将其分配给result
变量,然后在以后访问结果,请稍后再访问result
变量名,而不是geartable.result
属性。
另一个问题是if (Math.random() < 1 / ++count)
测试不平衡-较早出现的对象更有可能选择较晚出现的对象。可以通过仅使用Math.random()
从对象值数组中选择一个随机项来产生均衡的随机结果:
const values = Object.values(gearlist);
const randomValue = values[Math.floor(Math.random() * values.length)];
console.log(randomValue.cost);
return randomValue;
var geartable = {
shittyboots: {
name: "Shitty Boots",
cost: "500"
},
shittyarmor: {
name: "Shitty Armor",
cost: "1000"
},
shittyhelmet: {
name: "Shitty Helmet",
cost: "750"
}
};
var shops = {
positions: [
[2, 3],
[0, 1],
[2, 4]
],
inventory: [
[geartable.shittyboots.name, geartable.shittyboots.cost, "Available"],
[geartable.shittyarmor.name, geartable.shittyarmor.cost, "Available"],
[geartable.shittyhelmet.name, geartable.shittyhelmet.cost, "Available"]
]
};
function pickRandomItem(gearlist) {
const values = Object.values(gearlist);
const randomValue = values[Math.floor(Math.random() * values.length)];
console.log(randomValue.cost);
return randomValue;
}
pickRandomItem(geartable);