我需要一种方法将对象添加到另一个对象中。通常这只是
非常简单obj[property] = {'name': bob, 'height': tall}
然而,有问题的对象是嵌套的,因此需要以下内容:
obj[prop1][prop2] = {'name': bob, 'height': tall}
然而,关键是嵌套是可变的。那就是我不知道在运行时之前嵌套每个新对象的深度。
基本上我将生成一个表示对象路径的字符串,如
“object.secondObj.thirdObj.fourthObj”
然后我需要在第四个对象中设置数据,但我不能使用方括号[]方法,因为我不知道预先需要多少个括号。有没有办法做到这一点? 我也在使用jQuery,如果有必要的话。
答案 0 :(得分:4)
当然,您可以使用递归或简单迭代。我更喜欢递归。以下示例旨在作为概念验证,并且可能不应在生产中使用。
var setDeepValue = function(obj, path, value) {
if (path.indexOf('.') === -1) {
obj[path] = value;
return;
}
var dotIndex = path.indexOf('.');
obj = obj[path.substr(0, dotIndex)];
return setDeepValue(obj, path.substr(dotIndex + 1), value);
};
但是递归不是必需的,因为在JavaScript中你可以只改变引用。
var objPath = 'secondObj.thirdobj.fourthObj';
var valueToAdd = 'woot';
var topLevelObj = {};
var attributes = objPath.split('.');
var curObj = topLevelObj;
for (var i = 0; i < attributes.length; i++) {
var attr = attributes[i];
if (typeof curObj[attr] === 'undefined') {
curObj[attr] = {};
}
curObj = curObj[attr];
if (i === (attributes.length - 1)) {
// We're at the end - set the value!
curObj['awesomeAttribute'] = valueToAdd;
}
}
答案 1 :(得分:0)
而不是生成字符串......
var o="object";
//code
o+=".secondObj";
//code
o+=".thirdObj";
//code
o+=".fourthObj";
......你可以做到
var o=object;
//code
o=o.secondObj;
//code
o=o.thirdObj;
//code
o=o.fourthObj;
然后你可以添加这样的数据:
o.myprop='myvalue';
object
将根据更改进行更新。
请在此处查看:http://jsfiddle.net/rFuyG/