问题描述
我是 Javascript 新手,我想知道为什么当我创建以下对象时...
this.prospectCollection = {};
我不能使用 (参考第 14 行)
miningProspect(num,address)
{
console.log(`Checking for string: ${num}`);
let odds;
if(num == 0 || num == 0.00000000001 || num == 0.00000000005 || num == 0.00000000010)
{
if(address in this.prospectCollection)
{
this.prospectCollection[address][num] += 1;
//calculate prospects here
}
else
{
this.prospectCollection[address][num] = 1;
}
}
else
{
return false;
}
return true;
}
我想给对象动态名称我使用括号表示法,但它在控制台中给了我这个错误...
this.prospectCollection[address][num] = 1;
^
TypeError: Cannot set property '0.00000000001' of undefined
任何帮助或见解将不胜感激。
编辑:
是 this.prospectCollection = {[address]:{[num]:1}};
吗?难道这不会将它分配给那个并且不能像数组那样 .push() 东西吗?
解决方法
本质上,代码的关键部分可以这样重写:
if(!(address in this.prospectCollection))
{
this.prospectCollection[address][num] = 1;
}
但这不是正确的 JS,因为您基本上是在尝试访问 undefined
的属性(即 this.prospectCollection[address]
)。 JS 中没有 autovivification。
一种可能的方法是创建一个不存在的对象(手动激活):
this.prospectCollection[address] = this.prospectCollection[address] || {};
this.prospectCollection[address][num] = (this.prospectCollection[address][num] || 0) + 1;
另一个可行的选择是使用一些提供自动激活的库函数 - 例如 lodash.set。它可以像...一样简洁...
const path = ['prospectCollection',address,num];
_.set(this,path,_.get(this,0) + 1);