代码之家  ›  专栏  ›  技术社区  ›  Dänu

递归太多

  •  3
  • Dänu  · 技术社区  · 16 年前

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

    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出现问题 . 它 镀铬作品 .

    4 回复  |  直到 10 年前
        1
  •  4
  •   polygenelubricants    16 年前

    我不完全熟悉如何用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 . 这可能适用于所有情况,也可能不适用于所有情况,因此您可能希望更好地定义 可探索的 .

    还要注意,现在的递归更新 所有 匹配属性。

        2
  •  1
  •   x1a4    16 年前

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

        3
  •  1
  •   Matt Sach    16 年前

    你没有用 .hasOwnProperty() 在for循环内部 updateObject . 它能找到某种本质上是“无限”深度的内置属性吗?

        4
  •  0
  •   Pointy    16 年前

    这里有一个想法:

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

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