在这个递归函数中,我想替换(嵌套)对象中的值。
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 。
答案 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
};
这会添加一个测试,以确保您不会重新开始原始对象。