Javascript 太多的递归

Javascript 太多的递归,javascript,recursion,Javascript,Recursion,在这个递归函数中,我想替换(嵌套)对象中的值 运行此命令后,firefox在else if(objectSize(_object)>0){行抛出异常“过多递归” 编辑: 如果我设定 它可以工作,但它只搜索一个级别。如果我在嵌套对象中有一个嵌套对象,它就不会工作 还有什么想法吗 编辑: 这个问题发生在Firefox 3.6中。它在Chrome中工作我不是100%熟悉如何使用Javascript,但基本上你想要这样的东西: var testobj = { 'user': {

在这个递归函数中,我想替换(嵌套)对象中的值

运行此命令后,firefox在
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
};