2014-01-02 8 views
0

Мой код:Javascript конструктор копии массива, как пустой, когда он должен содержать элементы

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, родители будут пустым массивом. Что может быть причиной этого? Все остальные переменные в объекте ведут себя так, как ожидалось.

+0

, javascript is асинхронный. это основная причина вашей проблемы. –

+0

Вы не копируете «родители». – zeroflagL

ответ

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 требует другого подхода по сравнению с большинством других языков.

+0

Есть ли способ заставить javascript ждать завершения функции перед продолжением? – ahalbert

0

Я не вижу в коде каких-либо проблем, это странно, почему он становится пустым. но решить проблему есть способ. измените код следующим образом.

после этой линии

this.variables[v] = new BayesNode(vars[v]); 

Добавить последующей

this.variables[v].parents = vars[v].parents; 

Я вижу, вы не изменяем родителей в конструкторе, он будет работать на поры до времени, прежде чем узнать, Что происходит. вы могли бы сделать это уже :)

Смежные вопросы