Это длинный выстрел, но вы создаете глобальную переменную в цикле for
.Попробуйте вместо этого for(var i in data)
, а затем сообщите, пожалуйста.
Если это не весь объект и у вас есть свойство с ключом (например, 3: ...
) в родительском литерале Object
, которого нет в дочернем свойстве children
, оно, очевидно, будетвернуть undefined
, поскольку у этого ключа такого свойства нет.
Редактировать: Согласно вашему комментарию, это также может быть проблемой с областью действия функции, так как вы используете хвостовая рекурсия для перебора объекта с несколькими слоями.Таким образом, попытайтесь поместить текущую ссылку на объект вне области действия функции, как это было бы в любой конструкции языка JavaScript, которая требует динамической ссылки:
var current = null , match = null ;
function traverse() {
var data = arguments[0] ;
var pk = arguments[1] ;
for(var i in data) {
current = data[i] ; /* DEBUG */console.log( current.toSource() ) ; //!! Object.prototype.toSource() requires a W3 compatible browser (like FF)
if(current.pk !== undefined && current.pk === pk) return current ;
else if( typeof current.children === "object") traverse(current.children, pk);
}
}
match = traverse(data,pk) ;
Редактировать 2: Ошибка логики на моемчасть.Попробуйте вместо этого:
var match = null ;
function traverse() {
var data = arguments[0] ;
var pk = arguments[1] ;
var current = null ;
for(var i in data) {
current = data[i] ; /* DEBUG */console.log( current.toSource() ) ; //!! Object.prototype.toSource() requires a W3 compatible browser (like FF)
if(current.pk !== undefined && current.pk === pk) match = current ; //!! if there is a match set the variable match to the current object
else if( typeof current.children === "object") traverse(current.children, pk); //!! else use recursion to test a child property if present
}
}
Используя это, если ваш объект содержит указанное свойство, match
не будет null
и будет содержать соответствующий объект или дочерний объект.