太多的递归

时间:2010-05-29 16:10:57

标签: javascript recursion

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

var testobj = {
    'user': {
        'name': 'Mario',
        'password': 'itseme'
    }
};

updateObject('emesti', 'password', testobj)

function updateObject(_value, _property, _object) {
    for(var property in _object) {
        if(property == _property) {
            _object[property] = _value;
        }
        else if(objectSize(_object) > 0) {
            updateObject(_value, _property, _object[property]);
        }
    }

    return _object
};

function objectSize(_object) {
    var size = 0, key;
    for (key in _object) {
        if (_object.hasOwnProperty(key)) size++;
    }
    return size;
};

运行此命令后,firefox会在行else if(objectSize(_object) > 0) {上抛出异常“过多的递归”。

编辑: 如果我设置

function updateObject(_value, _property, _object) {
    for(var property in _object) {
        if(property == _property) {
            _object[property] = _value;
        }
        else if(_object[property].hasOwnProperty(_property)) {
            updateObject(_value, _property, _object[property]);
        }
    }

    return _object
};

它有效,但它只搜索一个级别。如果我在嵌套对象中有一个嵌套对象,它将无法工作。

还有什么想法?

编辑: Firefox 3.6中出现问题。它适用于Chrome

4 个答案:

答案 0 :(得分:4)

我不是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"

目前,任何不是字符串的内容都是explorable。这可能适用于所有情况,也可能不适用,因此您可能希望使用更好的explorable定义。

另请注意,递归现在会更新所有匹配属性。

答案 1 :(得分:1)

不应该if(objectSize(_object) > 0) {if(objectSize(_object[property]) > 0) {

答案 2 :(得分:1)

您未在.hasOwnProperty()内的for循环中使用updateObject。是否可以找到某种内在属性,这种属性本质上是“无限”的深度?

答案 3 :(得分:0)

这是一个想法:

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
};

这会添加一个测试,以确保您不会重新开始原始对象。