我的代码:
function BayesNet(vars) {
this.variables = {};
this.numVars = Object.keys(this.variables).length;
for (v in vars) {
this.variables[v] = new BayesNode(vars[v]);
this.variables[v].CPTorder = this.generateDomainRows(this.variables[v].parents);
this.variables[v].fullCPT = {}
for (var i = 0; i < this.variables[v].CPTorder.length; i++) {
this.variables[v].fullCPT[this.variables[v].CPTorder[i]] = this.variables[v].CPT[i];
}
this.variables[v].blocks = false;
}
}
function BayesNode(obj) {
this.parents = obj.parents;
this.children = obj.children;
if (typeof obj.domain == 'undefined')
this.domain = ['T','F'];
else
this.domain = obj.domain;
this.observation = obj.observation;
this.CPT = obj.CPT;
this.sampleDistribution = [];
for (var i = 0; i < this.CPT.length; i++) {
var s = [];
if(this.CPT[i].length == this.domain.length - 1)
this.CPT[i].push(1 - sumArray(this.CPT[i]));
s.push(this.CPT[i][0]);
for (var j = 1; j < this.domain.length - 1; j++) {
s.push(this.CPT[i][j]+s[j-1]);
}
s.push(1.0);
this.sampleDistribution.push(s);
}
//TODO: Check if CPT is valid
}
我的问题是BayesNode.parent被错误地复制了。
BayesNode.parent应该是一个包含项的数组,当我通过构造函数运行调试器时,this.parents是正确的值。但是,一旦我回到BayesNet构造函数,parent就是一个空数组。可能是什么导致了这个?对象中的所有其他变量都按预期运行。
答案 0 :(得分:1)
Javascript异步执行函数调用。这是您的问题的根本原因。您应该使用回调来执行依赖于函数调用结果的代码。
让我用你的代码解释一下:
this.variables[v] = new BayesNode(vars[v]);
this.variables[v].CPTorder = this.generateDomainRows(this.variables[v].parents);
当你调用构造函数时,JS不会等到函数完成执行,然后再转到下一行代码。当JS遇到“this.variables [v] .parents”时,它是空的,因为前一行中的函数调用仍然是异步执行。
与大多数其他语言相比,Javascript代码设计需要不同的方法。
答案 1 :(得分:0)
我没有看到你的代码中有任何问题,奇怪为什么它变空了。但要解决问题还有办法。更改代码如下。
这一行之后
this.variables[v] = new BayesNode(vars[v]);
添加以下
this.variables[v].parents = vars[v].parents;
我看到你没有修改构造函数中的父项,它会在你发现最新情况之前暂时工作。你可能已经这样做了:)