Javascript 太多的递归
在这个递归函数中,我想替换(嵌套)对象中的值 运行此命令后,firefox在Javascript 太多的递归,javascript,recursion,Javascript,Recursion,在这个递归函数中,我想替换(嵌套)对象中的值 运行此命令后,firefox在else if(objectSize(_object)>0){行抛出异常“过多递归” 编辑: 如果我设定 它可以工作,但它只搜索一个级别。如果我在嵌套对象中有一个嵌套对象,它就不会工作 还有什么想法吗 编辑: 这个问题发生在Firefox 3.6中。它在Chrome中工作我不是100%熟悉如何使用Javascript,但基本上你想要这样的东西: var testobj = { 'user': {
else if(objectSize(_object)>0){
行抛出异常“过多递归”
编辑:
如果我设定
它可以工作,但它只搜索一个级别。如果我在嵌套对象中有一个嵌套对象,它就不会工作
还有什么想法吗
编辑:
这个问题发生在Firefox 3.6中。它在Chrome中工作我不是100%熟悉如何使用Javascript,但基本上你想要这样的东西:
var testobj = {
'user': {
'name': 'Mario',
'password': 'itseme',
'bleh': {
'password': 'something'
}
}
};
function updateObject(_value, _property, _object) {
for(var property in _object) {
if(property == _property) {
_object[property] = _value;
}
else if(explorable(_object[property])) {
updateObject(_value, _property, _object[property]);
}
}
return _object
};
function explorable(_object) {
return typeof(_object) != "string";
};
updateObject('emesti', 'password', testobj);
document.writeln(testobj.user.password); // "emesti"
document.writeln(testobj.user.bleh.password); // "emesti"
目前,任何非字符串的内容都是可浏览的。这可能适用于所有情况,也可能不适用于所有情况,因此您可能希望对可浏览的内容使用更好的定义
还请注意,递归现在更新所有匹配的属性。不应该
if(objectSize(_object)>0){
if(objectSize(_object[property])>0{?您没有使用.hasOwnProperty()
在updateObject
内部的for循环中。它可能是在寻找某种本质上是“无限”深度的内置属性吗?这里有一个想法:
function updateObject(_value, _property, _object) {
function u(v, p, o) {
if (o === _object) return;
if (o.hasOwnProperty(p))
o[p] = v;
else {
for (var prop in o)
if (o.hasOwnProperty(prop))
u(v, p, o[prop]);
}
}
u(_value, _property, _object);
return _object
};
这增加了一个测试,以确保您不会从原始对象重新开始。嘿,马特,我认为该对象除了您设置的属性之外不能有任何其他属性。否则,我们不能将它们用作关联数组……哦,呵呵,@Dänu,但是的,对象肯定可以有其他属性,从其原型继承而来。这就是为什么
具有OwnProperty
函数存在!我已经看了大约半个小时了:-D非常感谢,但遗憾的是这不是“最终”解决方案。@Dänu:检查最新版本。我会尝试一下。顺便说一句,我尝试了:else if(objectSize(_object[property])>0&&property!=0){也可以工作..好的,我试试你的,javascript类型看起来很干净(通过typeof()返回)是“string”、“number”和“boolean”。至少,这些是我测试过的,我想数组也应该至少有一个。ok javascript类型:string、number、boolean、object、function、null和undefined。噢,真是个希卡科夫人。你混合了属性和属性吗?亲爱的上帝,请重命名它们。:rolleyes:…噢,好的旧论坛时代。。。
var testobj = {
'user': {
'name': 'Mario',
'password': 'itseme',
'bleh': {
'password': 'something'
}
}
};
function updateObject(_value, _property, _object) {
for(var property in _object) {
if(property == _property) {
_object[property] = _value;
}
else if(explorable(_object[property])) {
updateObject(_value, _property, _object[property]);
}
}
return _object
};
function explorable(_object) {
return typeof(_object) != "string";
};
updateObject('emesti', 'password', testobj);
document.writeln(testobj.user.password); // "emesti"
document.writeln(testobj.user.bleh.password); // "emesti"
function updateObject(_value, _property, _object) {
function u(v, p, o) {
if (o === _object) return;
if (o.hasOwnProperty(p))
o[p] = v;
else {
for (var prop in o)
if (o.hasOwnProperty(prop))
u(v, p, o[prop]);
}
}
u(_value, _property, _object);
return _object
};