我在普通CRNA项目中实现了以下函数(Iterate through Nested JavaScript Objects):
var findObjectByLabel = function(obj, label) {
if(obj.label === label) { return obj; }
for(var i in obj) {
if(obj.hasOwnProperty(i)){
var foundLabel = findObjectByLabel(obj[i], label);
if(foundLabel) { return foundLabel; }
}
}
return null;
};
当我尝试在构造函数或任何生命周期方法中执行此代码时,应用程序崩溃并超出最大调用堆栈大小。这是RN不允许的吗?我是否必须将其转换为迭代版本?
答案 0 :(得分:1)
如果您考虑上述功能的以下场景,您可以看到它破坏的原因:
type Node = { link: Node; value: number; };
const x: Node = { link: null, value: 0 };
const y: Node = { link: x, value: 1 };
x.link = y;
findObjectByLabel(x, 'foo');
因为有一个循环引用,你的递归将无限进行,你将达到最大调用堆栈大小。
您的对象结构中可能存在某种循环引用,可以解决此问题。
如果您可以保证所有匹配对象都具有非空label
并且标签是唯一的,那么您可以跟踪seenLabels
而不是递归到您已经拥有的对象中看到了标签。